【问题标题】:deleting object allocated with a custom new operator删除使用自定义 new 运算符分配的对象
【发布时间】:2012-07-22 13:38:00
【问题描述】:

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

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

在默认分配器中,存储块被释放使用 ::运算符删除。

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

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

我猜allocate()construct() 方法也有同样的问题。

【问题讨论】:

    标签: c++ memory memory-management


    【解决方案1】:

    这意味着通过使用 deallocate() 函数 被释放并调用析构函数

    不,它没有。 ::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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多