嗨我写了一个快速测试。我想删除调用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 deletedeleteMe再次调用。这是确定超载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()方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top