【发布时间】:2014-07-07 19:31:56
【问题描述】:
问题:
有没有办法让 delete 表现得像一个假人,即在调用时什么也不做?
为什么我需要答案:
我正在使用自定义内存池,当调用静态方法Pool::freeAllObjects() 时,它会从内存中释放所有对象。
所有类都有一个重载的运算符 new,如下所示:
void * operator new (size_t size)
{
void * obj = Pool::memory()->allocate(size);
Pool::memory()->save_destructor((ClassName*)obj);
return obj;
}
Pool::memory()->save_destructor() 只是保存了一个指向运行泛型析构函数的函数的指针。
如果没有人对使用池创建的对象调用delete,那么一切都会正常运行,但是在我们想要使用它的代码中,有许多对象实例都调用了delete,因此为了向后兼容我试图像这样制作一个重载的delete
void operator delete(void*) {/*do nothing*/}
在具有重载new 的类中使用Pool::memory()
,但看起来这并没有解决问题。我使用了一个简单的 std::cout 来查看调用的 cons/destructor 和一个重载的删除,例如:
void operator delete(void*) {std::cout << "deleting ClassName" << std::endl;}
所以在这样的代码中:
ClassName * instance = new ClassName();
instance->runMethod();
delete instance; //this is legacy code calling delete before the pool was developed
/*
other code goes here
*/
Pool::freeAllObjects(); // oops instance was already deleted
我得到以下输出:
constructing ClassName
destructing ClassName
deleting ClassName
destructing ClassName
编辑: 抱歉,我没有提到要求是不使用智能指针,并且也不允许将 operator delete 设为私有(顺便说一句,我认为这是最好的选择)。
【问题讨论】:
-
你不能阻止析构函数在使用 delete 时被调用。您可以修改
operator delete,但删除是一个两步过程:调用对象的析构函数然后调用operator delete。您可以将unique_ptr/shared_ptr与自定义删除器一起使用,该删除器实际上并不调用 delete,并且永远不会处理原始指针或显式调用 delete。
标签: c++ memory-management operator-overloading