删除使用自定义新运算符分配的对象

时间:2012-07-24 08:57:16

标签: c++ memory memory-management

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

现在我的问题是标准分配器的工作方式,即deallocate()功能。在this文章中,我可以阅读

  

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

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

所以,问题是, STL容器如何使用allocator类创建新对象?由于默认分配器使用newdelete,容器是否会调用construct()destroy()我是否应该调用deallocate()函数理论师?

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

1 个答案:

答案 0 :(得分: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' 释放记忆。例如:

{{1}}