在我最初的基本测试中,这样做是完全安全的.然而,它已经让我吃惊试图操纵this
该功能后delete
小号this
可能是一个运行时错误.这是真的,通常是安全的delete this
吗?或者只有某些安全的情况?
delete this
是合法的并且做你期望的事情:它调用你的类的析构函数并释放底层内存.之后delete this
的回报,你的this
指针值并没有改变,所以它现在是一个悬摆指针应该不会被取消引用.这包括使用类的成员变量进行隐式解除引用.
通常在引用计数类中找到,当ref-count递减为0时,DecrementRefCount()
/ Release()
/无论成员函数调用什么delete this
.
delete this
由于许多原因,通常被认为是非常糟糕的形式 以后很容易意外访问成员变量delete this
.来电者代码可能无法实现您的对象具有自毁功能.
此外,delete this
您的代码可能没有对象所有权的对称策略(谁分配和删除谁)是一种"代码味道".一个对象不能自己分配new
,所以调用delete this
意味着A类正在分配一个对象,但是B类稍后会释放它[self].
删除"this"是安全的,只要它基本上是方法中的最后一个操作.事实上,有几个专业级别的API会这样做(参见ATL的CComObject实现示例).
唯一的危险是在调用"删除此"后尝试访问任何其他成员数据.这当然不安全.
删除这是完全合法的,因为其他人已经提到过.尚未提及的另一个原因是冒险的 - 您假设该对象已在堆上分配.这可能难以保证,尽管在引用计数实现的情况下通常不是问题.
但是不要在析构函数中做到这一点!
正如其他人所说,删除这是一个有效的习惯用法,但为了安全起见,你必须确保对象永远不会在堆栈上实例化.
一种方法是使构造函数和析构函数都是私有的,并通过类工厂函数强制创建对象,该函数在堆上创建对象并返回指向它的指针.类工厂可以是静态成员函数或友元函数.然后可以通过执行"删除此操作"的对象上的Delete()方法完成清理.COM对象基本上以这种方式工作,除此之外,它们是引用计数,当引用计数减少到零时发生"删除此".