嘿伙计们,我写了一个快速测试。我想删除调用deleteMe,然后它会自行删除。这样做的目的是让我可以正常删除由lib分配的obj。 (我不希望因 crt 或 w/e 导致任何崩溃)。
通过删除这个,我得到了一个堆栈溢出,没有它,msvc 说我泄漏了 4 个字节。当我不调用 test 时,我泄漏 0。如何删除而不存在递归问题?
-编辑-
为了让这一点更清楚。我希望LIB调用delete(因此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
,这称为 Boperator delete
那个叫deleteMe
再次。超载也没关系operator delete
(虽然你通常超载operator new
也),特别是在处理“外来”对象时(这可能是您的情况),但是您必须依次从自定义内部调用实际的清理例程delete
.
一般情况下超载operator delete
必须匹配operator new
。在你的情况下:
B *p = new D;
Here p
与全局分配new
,所以它必须与全局一起释放delete
. So:
class D : public B
{
public:
void deleteMe() {
::delete this;
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)