C++ 是";删去这句话;坏主意?
可能重复:C++ 是";删去这句话;坏主意?,c++,memory-management,C++,Memory Management,可能重复: 我在一个类上做了一些工作,这个类被设计成链接列表中的一个节点,我想我应该给这个类提供自己的删除功能,而不是让管理类这样做。所以基本上是这样的: void Class::Delete() { //Some cleanup code before deleting the object delete this; } 现在我已经测试过了,它看起来很好,但是在过去,对象已经在运行代码中间,已经被删除,然后明显地通过试图使用一个不再存在的对象来破坏程序。 由于“delete
我在一个类上做了一些工作,这个类被设计成链接列表中的一个节点,我想我应该给这个类提供自己的删除功能,而不是让管理类这样做。所以基本上是这样的:
void Class::Delete() {
//Some cleanup code before deleting the object
delete this;
}
现在我已经测试过了,它看起来很好,但是在过去,对象已经在运行代码中间,已经被删除,然后明显地通过试图使用一个不再存在的对象来破坏程序。 由于“deletetthis”正好位于函数的末尾,因此它显然退出了函数并运行良好,但这种做法是不是一个坏主意?如果我不小心,这会不会在我脸上爆炸?
答案很好: 只要你小心,这对你来说是可以的 要自杀的对象(删除 这个) 以下是我对“小心”的定义:基本上,您需要像处理
delete
ing任何其他指针一样小心。但是,与显式声明的指针相比,成员函数自杀可能会在更多方面出错。有一种简单的方法可以做同样的事情,而不涉及未定义的行为:
void Class::Delete() {
//Some cleanup code before deleting the object
std::auto_ptr delete_me(this);
}
如果不确定是否存在陷阱,那么使用
删除此
是一个坏主意
调用delete this
后,将调用对象的析构函数,并释放动态分配的内存
如果未使用new
分配对象,则该对象将是未定义行为
如果在
删除此
后访问了对象的任何数据成员或虚拟函数,则该行为将再次成为未定义行为
<> P> >最好是避免<代码>删除< <代码> >。 C++中的习惯用法是将清除代码放入析构函数中,然后在删除对象时自动调用它。
Class::~Class() {
do_cleanup();
}
void ManagingClass::deleteNode(Class* instance) {
delete instance; //here the destructor gets called and memory gets freed
}
这实际上是一个常见的习惯用法,几乎和任何删除一样安全。作为 对于所有删除,您必须确保没有其他代码试图删除 访问该对象,您必须确保该对象 动态分配。然而,通常情况下,后者不是 问题是,因为习语只与具有 生命周期由对象的语义决定,这样的对象是 始终动态分配。找到所有的指针也很重要 对象可以是问题(是否使用了
删除此);通常
某种形式的观察者模式将用于通知所有感兴趣的人
对象将不再存在。这样做是可以的,但正如您之前发现的那样,这样做并不一定安全。您无法再与对象交互。对于运行然后自行消亡的线程对象来说是有意义的。如果没有任何东西能提到他们,那也没关系。我很好奇。。为什么?打印指针etc根本无法访问底层内存。出于好奇,您为什么不在删除此项之后读取此
的值代码>?在我看来,在任何情况下,这都是一个普通的删除,之后可以阅读(当然几乎没有用)。这是标准中明确禁止的,还是FAQ有点过于谨慎?“如果delete运算符的操作数是可修改的l值,则其值在对象被删除后是未定义的。”-仅仅因为它在FAQLite中并不意味着它是真的。提到的每一点同样适用于所有删除。删除此
(事实上,在许多应用程序中,它将代表大多数删除操作)没有什么特别之处。@Jon根据标准,无效指针的任何左值到右值转换都是未定义的行为。删除对象会使指向该对象的所有指针无效。(这与删除此
无关。它是系统性的。)这与删除此
有何不同?我看不出auto_ptr
如何归结为除了删除此
之外的任何东西,因此与普通实现相比没有任何优势。我错了吗?这不能回答问题。糟糕。这只会增加混淆。@larsm,我刚刚做了一次编辑,应该会让这一点更清楚-区别在于,delete
不会发生,直到你离开对象的范围。@Nawaz,它确实有点间接地回答了这个问题。如果你可以选择两种技术来做同样的事情,一种是保证安全的,另一种是不安全的,你应该选择安全的。这完全是错误的。或者更确切地说,它适用于delete
的所有用法。删除此
没有什么特别之处。这与问题有什么关系?清理c