使用C ++中的成员函数删除对象

时间:2014-04-02 11:31:13

标签: c++ pointers memory-management memory-leaks

有这个:

class Foo
{
public:
    void destroy() { delete this; }
public:
    // Stuff here...
};

int main(int argc, char *argv[])
{
    Foo* foo = new Foo;

    // Option 1
    delete foo;

    // Option 2:
    foo->destroy();

    return 0;
}

选项1和选项2的操作是否相同?这是一个正确的'破坏物体的方法?为什么/为什么不呢?

非常感谢你,

4 个答案:

答案 0 :(得分:3)

是的,在这种情况下,两者是等效的。

但是你肯定更喜欢选项1. delete this很容易出错,违反了各种设计原则,在这种情况下完全没有意义。

答案 1 :(得分:2)

选项1是删除类对象的推荐方法。

class Foo
{
public:
    ~Foo()
    {
       //define destructor if you have any pointer in your class
    }
public:
    // Stuff here...
};


int main()
{
    Foo* foo = new Foo;

    // By deleting foo it will call its destructor 
    delete foo;
}

对于选项2

C ++ FAQ Lite专门为此提供了一个条目 http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

  

只要你小心,对象就可以自杀(删除它)。

答案 2 :(得分:2)

正如其他人所说,这并不常见且气馁。一个通常可靠的消息来源说,如果你严格遵守一些规则,你可以在技术上做到这一点;特别是,删除后不要访问已释放的内存或类成员:http://www.parashift.com/c++-faq/delete-this.html

答案 3 :(得分:2)

此类销毁方案(删除this指针的成员函数)是实施classes that allow instances only on the heap

时的常见解决方案
class Foo
{
    ~Foo(); // private destructor - won't allow objects on the stack
public:
    void destroy() { delete this; }
public:
    // Stuff here...
};

在上面的示例中,无法调用析构函数,因此您无法说

delete FooInstance;

并且避免内存泄漏的唯一选择是使用destroy函数:

FooInstance->destroy();

除此之外,我还没有找到任何真实世界的案例,其中必须使用这种破坏功能。