nicht verwenden In meinem C++ 11-Programm verwende ich shared_ptr<T>
für einige Objekte, die aktiv erstellt und gelöscht werden. Es ist so passiert, dass Standard-Allokator mit operator new
ist ein Engpass, so dass ich eine eigene erstellen möchte, die eine Menge Speicher auf einmal zuzuteilen und dann zu make_shared
auf Anfrage geben wird. Leider ist dies das erste Mal, dass ich einen allocator schreiben, und ich habe keine Ahnung, warum GCC nicht in der Lage ist, den folgenden Code zu kompilieren:Kann benutzerdefinierte Zuordner mit allocate_shared/make_shared
#include <memory>
class MyAlloc {
public:
typedef char* pointer;
typedef const char* const_pointer;
typedef char value_type;
char* allocate(size_t len) {
return new char[len];
}
void deallocate(char *ptr) {
delete[] ptr;
}
} my_alloc;
int main() {
std::allocator_traits<MyAlloc>();
// MyAlloc is a correct allocator, since allocator_traits can be instantiated
// If I comment the following line of code, compilation is successful
std::allocate_shared<int>(my_alloc, 0);
return 0;
}
Hier habe ich sehr einfach Stummel allocator und einen Aufruf an allocate_shared
. Der Fehler GCC produziert ist:
In file included from c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\ext\alloc_traits.h:36:0,
from c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_construct.h:61,
from c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\memory:64,
from a.cpp:1:
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\alloc_traits.h: In substitution of 'template<class _Alloc> template<class _Tp> using rebind_traits = std::allocator_traits<typename std::__alloctr_rebind<_Alloc, _Tp>::__type> [with _Tp = std::_Sp_counted_ptr_inplace<int, MyAlloc, (__gnu_cxx::_Lock_policy)2u>; _Alloc = MyAlloc]':
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\shared_ptr_base.h:517:33: required from 'std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& ...) [with _Tp = int; _Alloc = MyAlloc; _Args = {int}; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]'
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\shared_ptr_base.h:986:35: required from 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = MyAlloc; _Args = {int}; _Tp = int; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]'
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\shared_ptr.h:316:64: required from 'std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = MyAlloc; _Args = {int}; _Tp = int]'
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\shared_ptr.h:598:39: required from 'std::shared_ptr<_Tp1> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = int; _Alloc = MyAlloc; _Args = {int}]'
a.cpp:19:40: required from here
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\alloc_traits.h:204:66: error: invalid use of incomplete type 'struct std::__alloctr_rebind<MyAlloc, std::_Sp_counted_ptr_inplace<int, MyAlloc, (__gnu_cxx::_Lock_policy)2u>, false>'
using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
^
c:\soft\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\alloc_traits.h:65:12: error: declaration of 'struct std::__alloctr_rebind<MyAlloc, std::_Sp_counted_ptr_inplace<int, MyAlloc, (__gnu_cxx::_Lock_policy)2u>, false>'
struct __alloctr_rebind;
^
Warum ist das passiert? Wie schreibe ich Zuweiser korrekt, so dass sie mit allocate_shared
arbeiten? Ich weiß, dass es noch einige andere Operatoren und Typmerkmale gibt, die vom Allokator unterstützt werden sollen, aber ich sehe keinen Hinweis darauf, was GCC von mir will. Auch
, ist es OK char
als value_type
für dieses besondere allocator zu verwenden (in Verbindung mit shared_ptr
) oder so etwas wie void
oder shared_ptr<T>::some_weird_stuff
ist preferrable?
Sie müssen eine 'Rebind'-Member-Vorlage (und einige andere Sachen) bereitstellen. Siehe [allocator.requirements] oder [cppreference: Allocator requirements] (http://en.cppreference.com/w/cpp/concept/Allocator) – dyp