我知道在正常情况下如何处理内存解除分配。我的情况略有不同。
我正在实现自己的内存池。我希望我班级的客户能够接近分配和解除分配的一般方法。
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 new
和operator delete
,并从那里调用Allocate
和DeAllocate
。
答案 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在堆上分配任何其他内容......