我正在尝试编写一个使用STL分配器的容器类。我目前所做的是拥有一名私人会员
std::allocator<T> alloc_;
(稍后会模板化以便用户可以选择不同的分配器),然后调用
T* ptr = alloc_.allocate(1,0);
获取指向新分配的'T'对象的指针(并使用alloc_.construct来调用构造函数;请参阅下面的答案)。这适用于GNU C ++库。
但是,对于Solaris上的STLPort,这无法做正确的事情并导致各种奇怪的内存损坏错误。如果我改为
std::allocator_interface<std::allocator<T> > alloc_;
然后一切正常。
使用stl :: allocator的正确方法是什么? STLPort / Solaris版本无法用g ++编译,但是g ++是对的吗?
答案 0 :(得分:16)
您需要使用分配器进行分配和构造。像这样:
T* ptr = alloc_.allocate(1,0);
alloc_.construct(ptr, value);
如果你没有从一个正确构造的对象开始,很多东西都会彻底破坏。想象一下,std::string
被分配但未构建。当你尝试分配它时,它会首先尝试通过释放一些数据来清理它的旧内容,这些数据当然是来自堆的垃圾值并崩溃。
答案 1 :(得分:9)
您可能想要做的事情是拥有自己的自定义allocator
,您可以使用它来查看标准容器如何与分配器进行交互。 Stephan T. Lavavej发布了一个名为mallocator
的简单的简单版。将它放入使用各种STL容器的测试程序中,您可以轻松地看到标准容器如何使用分配器:
并非mallocator
中的所有接口函数(例如construct()
和destroy()
)都使用跟踪输出进行检测,因此您可能希望更轻松地删除其中的跟踪语句看看标准容器如何在不诉诸调试器的情况下使用这些函数。
这应该可以让您更好地了解您的容器如何使用自定义allocator
。