21

我正在尝试编写一个使用 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++ 对吗?

4

2 回答 2

16

您需要使用分配器进行分配和构造。像这样的东西:

T* ptr = alloc_.allocate(1,0);
alloc_.construct(ptr, value);

如果你没有从一个正确构造的对象开始,很多事情都会被彻底破坏。想象一个std::string被分配但没有被构造的东西。当您尝试分配给它时,它会首先尝试通过释放一些数据来清理其旧内容,这些数据当然是堆中的垃圾值并崩溃。

于 2010-03-24T16:45:34.987 回答
9

您可能想要做的是有自己的自定义allocator,您可以使用它来查看标准容器如何与分配器交互。Stephan T. Lavavej 发布了一个不错的、简单的名为mallocator. 将其放入使用各种 STL 容器的测试程序中,您可以轻松查看标准容器如何使用分配器:

并非所有mallocator(例如construct()destroy())中的接口函数都使用跟踪输出进行检测,因此您可能希望将跟踪语句放入其中,以便更轻松地查看标准容器如何使用这些函数而无需借助调试器。

这应该让您很好地了解您的容器可能会如何使用自定义allocator.

于 2010-03-24T17:42:37.527 回答