当前位置:  开发笔记 > 编程语言 > 正文

"删除这个"是否安全?

如何解决《"删除这个"是否安全?》经验,为你挑选了5个好方法。

在我最初的基本测试中,这样做是完全安全的.然而,它已经让我吃惊试图操纵this该功能后delete小号this可能是一个运行时错误.这是真的,通常是安全的delete this吗?或者只有某些安全的情况?



1> Chris Peters..:

delete this是合法的并且做你期望的事情:它调用你的类的析构函数并释放底层内存.之后delete this的回报,你的this指针值并没有改变,所以它现在是一个悬摆指针应该不会被取消引用.这包括使用类的成员变量进行隐式解除引用.

通常在引用计数类中找到,当ref-count递减为0时,DecrementRefCount()/ Release()/无论成员函数调用什么delete this.

delete this由于许多原因,通常被认为是非常糟糕的形式 以后很容易意外访问成员变量delete this.来电者代码可能无法实现您的对象具有自毁功能.

此外,delete this您的代码可能没有对象所有权的对称策略(谁分配和删除谁)是一种"代码味道".一个对象不能自己分配new,所以调用delete this意味着A类正在分配一个对象,但是B类稍后会释放它[self].


你没有提到[你不能在析构函数中调用`delete this`](http://stackoverflow.com/a/447531/111307).
"删除这个通常被认为是非常糟糕的形式,原因很多." 我认为这就是为什么精心设计的引用计数类不使用删除这个; .他们使用手柄/身体成语.在我看来,使用删除这几乎总是一个坏主意.(好吧,我不知道*任何*理由 - 但我要小心)
从技术上讲,你的最后一段是不正确的.虽然对象无法自行分配,但这并不意味着您下次去的地方.因此,不是因为另一个类分配了它.同一个类上的静态工厂方法可以完成创建.

2> JaredPar..:

删除"this"是安全的,只要它基本上是方法中的最后一个操作.事实上,有几个专业级别的API会这样做(参见ATL的CComObject实现示例).

唯一的危险是在调用"删除此"后尝试访问任何其他成员数据.这当然不安全.


在析构函数中调用`delete this`也有危险

3> 1800 INFORMA..:

删除这是完全合法的,因为其他人已经提到过.尚未提及的另一个原因是冒险的 - 您假设该对象已在堆上分配.这可能难以保证,尽管在引用计数实现的情况下通常不是问题.


"适当的"解决方案是拥有私有析构函数.然后,对象可以调用delete this,但是您无法建立基于堆栈的版本.

4> 小智..:

但是不要在析构函数中做到这一点!


是的,这很糟糕.

5> Bruce Ikin..:

正如其他人所说,删除这是一个有效的习惯用法,但为了安全起见,你必须确保对象永远不会在堆栈上实例化.

一种方法是使构造函数和析构函数都是私有的,并通过类工厂函数强制创建对象,该函数在堆上创建对象并返回指向它的指针.类工厂可以是静态成员函数或友元函数.然后可以通过执行"删除此操作"的对象上的Delete()方法完成清理.COM对象基本上以这种方式工作,除此之外,它们是引用计数,当引用计数减少到零时发生"删除此".

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有