2012-07-24 101 views
2

我正在为STL编写基于堆栈的分配器。这个想法是一次分配一大块内存,让它在构建对象时建立起来,然后在需要时将其重置为零。例如,这可用于存储游戏级别信息或用于为游戏循环的单次迭代创建的对象。当你加载一个级别时,你建立了堆栈,当你需要加载一个新的级别时,你只需将顶部指针重置到开始位置,不需要OS调用。删除分配给自定义新运算符的对象

现在我的问题是标准分配器的做法,即deallocate()函数。在this文章中,我可以读取

在缺省分配,存储块被释放使用 ::运算符删除。

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

所以,问题是,STL容器如何使用分配器类来创建新对象?由于默认分配器使用newdelete,容器有没有呼叫construct()destroy()我应该让我的deallocate()函数也调用descrutor?

我想同样的问题是allocate()construct()方法。

回答

6

这意味着通过解除分配()函数两存储 被释放,调用析构函数

不,它不需要。 ::operator delete是全局删除功能,它只是释放内存。 delete运算符是一个不同的东西,尽管名称相似 - 它会破坏并调用删除函数(全局删除函数或超载)。

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

标准容器使用allocate得到一些记忆,然后construct如果当他们需要的内存包含的元素,destroy当且仅当他们construct ED和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'