2

嘿伙计们,我写了一个快速测试。我想 delete 调用 deleteMe 然后删除自己。这样做的目的是让我可以正常删除由 lib 分配的 obj。(我不希望由于 crt 或 w/e 导致任何崩溃)。

删除这个我得到一个stackoverflow,没有它msvc说我泄露了4个字节。当我不调用测试时,我泄漏 0。我如何删除 w/oa 递归问题?-edit- 使这一点更清楚。由于crt,我希望LIB调用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;
}
4

3 回答 3

1

您不应该覆盖删除。尤其是对于最终调用删除的函数。您需要执行的任何内存释放(并且在本示例中您不需要执行任何操作)都应在析构函数中完成。

于 2009-01-14T13:55:20.273 回答
1

递归是由于deleteMe调用delete,它调用operator deletedeleteMe再次调用的 B。可以重载operator delete(尽管您通常operator new也会重载),尤其是在处理可能是您的情况的“外来”对象时,但是您必须反过来从 custom 中调用实际的清理例程delete

在一般情况下,重载operator delete必须匹配operator new. 在你的情况下:

B *p = new D;

这里p是用全局分配的new,所以它必须用全局释放delete。所以:

class D : public B
{
public:
    void deleteMe()      {
        ::delete this;
    }
};
于 2009-01-14T14:10:44.127 回答
0

您最好只使用您的客户应该调用的 Destroy() 方法......这将保护您的库免受堆中的差异。

于 2009-01-14T14:08:21.183 回答