删除这个我得到一个stackoverflow,没有它msvc说我泄漏了4个字节。当我不打电话测试我泄漏0.如何删除没有递归问题? -编辑- 使这更清楚。我希望LIB通过crt
调用delete(因此deleteMe)而不是程序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;
}
答案 0 :(得分:1)
你不应该重写删除。特别是对于最终调用delete的函数。任何你需要做的内存释放(在这个例子中你不需要做任何事情)都应该在析构函数中完成。
答案 1 :(得分:1)
递归是由deleteMe
调用delete
引起的,该operator delete
调用再次调用deleteMe
的B 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;
}
};
释放它。所以:
{{1}}
答案 2 :(得分:0)
您可能最好只使用Destroy()方法,客户端应该调用它...这将保护您的lib免受堆中的差异。