有这个:
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的操作是否相同?这是一个正确的'破坏物体的方法?为什么/为什么不呢?
非常感谢你,
答案 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();
除此之外,我还没有找到任何真实世界的案例,其中必须使用这种破坏功能。