-
22-07-2019 - |
题
嗨我写了一个快速测试。我想删除调用DELETEME然后将删除自身。这样做的目的是这样我就可以正常删除OBJ它们由一个lib分配。 (我不想由于CRT或瓦特/电子任何崩溃)。
通过删除我得到一个计算器,如果没有它MSVC说我泄露的4个字节。当我不叫我试漏0如何删除W / O递归问题? -编辑- 以使其更清晰。我想要的LIB调用删除(因此DELETEME)而不是节目由于CRT
class B
{
public:
virtual void deleteMe()=0;
static void operator delete (void* p) { ((B*)p)->deleteMe(); }
};
class D : public B
{
public:
void deleteMe() {
delete this;
}
};
int test()
{
B *p = new D;
delete p;
return 0;
}
解决方案
递归是由于deleteMe
主叫delete
,它调用B的operator delete
该deleteMe
再次调用。这是确定超载operator delete
(虽然你平时超载operator new
为好),尤其是在处理时“外国”的对象是可能你的情况,但必须依次调用实际清理例程从定制delete
内。
在一般情况下一个重载operator delete
必须operator new
匹配。在你的情况:
B *p = new D;
下面p
被分配与全球new
,因此它必须与全局delete
被释放。所以:
class D : public B
{
public:
void deleteMe() {
::delete this;
}
};
其他提示
您不应该是覆盖删除。特别是不要到最终调用删除功能。你需要做的(你不需要做任何在这个例子中)的任何内存释放应在析构函数来完成。
您可能最好只是有你的客户,预计打电话......这会保护你的lib从堆差异的destroy()方法。
不隶属于 StackOverflow