operator delete - 如何实现?

时间:2014-12-09 15:56:49

标签: c++ memory-management new-operator delete-operator

我知道在正常情况下如何处理内存解除分配。我的情况略有不同。

我正在实现自己的内存池。我希望我班级的客户能够接近分配和解除分配的一般方法。

inline void* operator new(size_t dead_param, CPool&  objPool)
{
    return objPool.Allocate();
}

我有这个全局函数,所以我班级的用户可以简单地调用

Base baseObj = new (poolObj)Base2();

现在我不知道如何调用析构函数?我清楚没有想法

虽然我有全局运算符删除

inline void operator delete(void* ptr, CPool& objPool)
{
    objPool.DeAllocate(ptr);
}

请指导..如何从客户端代码调用此函数?用户端语法的变化很小。另请注意,我不希望我的代码用户实施operator newoperator delete,并从那里调用AllocateDeAllocate

1 个答案:

答案 0 :(得分:1)

缺点:使用placement new是显式调用析构函数的唯一情况:

baseObj->〜基地();

但是这看起来很糟糕,因为在您的内存池中,您实际上正在让最终用户完成所有的簿记...这使得您的内存池类没有比使用更好(并且可能更糟糕)一个std :: vector。

我不会让用户自己做新的放置...而是,如果提供自己的内存池,它应该使用ObjectPool类完成:

class ObjectPool {
  public:
    template <typename T, typename... A>/*c++ 11 ftw*/
    T* allocate(A... args) {
       void* create_location;//pool figures out where this is, probably with sizeof<T>

       return new (create_location) T(args...);
     }
     template <typename T>
     void dellocate(T* t) {
         t.~T();//With placement new, this is the one place this is OK
         //pool marks that memory as avaiable to be allocated in
     }
 }

老实说,这是您的游戏池获得更多实用程序的唯一方法,然后最终用户只需创建自己的std::vector<uint8_t>

应该注意的是,这不会阻止T在堆上分配任何其他内容......