gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:05 25 4
gpt4 key购买 nike

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

现在我的问题是标准分配器做事的方式,即 deallocate() 函数。在 this我能读懂那篇文章

In the default allocator, the block of storage is deallocated using ::operator delete.

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

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

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

最佳答案

which implies that by using the deallocate() function both the memory is freed and the destructor is called

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

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

标准容器使用allocate 来获取一些内存,然后construct 如果它们需要内存来包含一个元素,destroy 如果和仅当它们constructed 和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'

关于c++ - 删除使用自定义新运算符分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11627426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com