2

我正在为 STL 编写一个基于堆栈的分配器。这个想法是一次分配一大块内存,并在构造对象时让它建立起来,然后在需要时将其重置为零。例如,这可用于存储游戏的关卡信息或为游戏循环的单次迭代创建的对象。当你加载一个关卡时,你建立了堆栈,当你需要加载一个新的关卡时,你只需将顶部指针重置为开头,不需要操作系统调用。

现在我的问题是标准分配器做事的方式,即deallocate()函数。在这篇文章中,我可以读到

在默认分配器中,使用 ::operator delete 释放存储块。

这意味着通过使用该deallocate()函数,既可以释放内存,又可以调用析构函数。现在为了我的分配器的目的,我可以使deallocate()函数为空,因为我不会为单个对象释放内存。

那么问题来了,STL 容器如何使用分配器类来创建新对象?由于默认分配器使用newand delete,容器是否曾经调用construct()or destroy()我应该让我的deallocate()函数也调用 descutor 吗?

我想同样的问题也适用于allocate()andconstruct()方法。

4

1 回答 1

6

这意味着通过使用 deallocate() 函数既可以释放内存,又可以调用析构函数

不,它没有。::operator delete是全局删除函数,它只是释放内存。delete运算符是另一回事,尽管名称相似——它先解构然后调用删除函数(全局删除函数或重载)。

析构destroy函数由分配器的函数调用。

标准容器用于allocate获取一些内存,然后construct当且仅当它们需要该内存以包含元素时,destroy当且仅当它们construct编辑并deallocate释放内存时。例如:

{
    std::vector<int> v; // may or may not call anything on the allocator
    v.reserve(10000); // calls 'allocate'
    v.resize(100); // calls 'construct' 100 times
    v.resize(50); // calls 'destroy' 50 times
} // destructor calls 'destroy' 50 times and then 'deallocate'
于 2012-07-24T09:10:02.403 回答