删除重载,递归溢出

时间:2009-01-14 13:49:59

标签: operator-overloading stack-overflow

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

删除这个我得到一个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;
}

3 个答案:

答案 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免受堆中的差异。