C++ 中 delete this 有什么必要的应用场景?

2019-04-26 18:38:25 +08:00
 inhzus

不想往下看的话, 完整问题: 有什么使用 delete this 的必要的应用场景: 即: 不使用 delete this 会使代码变得 confused, 异常冗余, 或难以实现功能.

刚刚经历了一次校招面试, 面试官问我觉得 delete this 在成员函数中能不能使用和一些相关的问题(记不大请了). 我之前是没有写过这样的代码的, 所以当时觉得很疑惑. 面试要结束的时候, 他让我试一试使用 delete this.

经过 Google, C++ 规范中, delete this 是可以在非析构函数中调用的(否则会陷入无限递归). 在 C++ FAQ 中写道, 只要你足够小心, 也是可以调用的. (小心的条件: 对象在堆上创建, 当前成员函数是最后一个调用的, 且在成员函数中不会再使用 this, 成员函数外没有再对这一变量做任何操作)

在我没想到实例的情况下, 我搜了一下如何使用

Stackoverflow 上有一个 delete this 的实例, 是关于 引用计数, 在 release() 函数中, 计数值变为 0 时, 手动 delete this.

但这样子一方面不能做到线程安全, 另一方面使用 release() 函数为什么不在外面实现一个类, 管理这个类的引用计数值, 代码也会更安全.

所以想问下会 C++ 的 V 友, 有什么使用 delete this 的必要的应用场景: 即: 不使用 delete this 会使代码变得 confused, 异常冗余, 或难以实现功能.

4726 次点击
所在节点    C
13 条回复
shylockhg
2019-04-26 19:00:06 +08:00
无卵用
reeonce
2019-04-26 19:05:25 +08:00
翻译成“自杀”,就很好理解了吧。
ArchVile
2019-04-26 19:06:42 +08:00
C++界面开发窗口类中,最后一条消息函数是 FinalMessage,通常都会调用 delete this 删除自己
ArchVile
2019-04-26 19:07:38 +08:00
ccpp132
2019-04-26 19:08:32 +08:00
很多年前用过,不过现在都是智能指针,delete 都没怎么用了。c++里大部分功能都有替代用法,没什么必须的
robot9
2019-04-26 23:35:14 +08:00
在 async 的 call 的时候 可以把 resource 的指针放在 callback 里删掉
yujincheng08
2019-04-27 00:36:15 +08:00
有时候,可以在抛出异常前把自己释放掉。

讲道理,有了智能指针之后 delete 基本都杜绝了别说 delete this 这种了。
macha
2019-04-27 08:05:37 +08:00
UI 点×时候要顺便销毁自己,所以要 delete this
AngelCriss
2019-04-27 08:40:58 +08:00
你看看 folly 的代码就会发现很多 delete this 和 new (this) T 的配套
AngelCriss
2019-04-27 08:47:10 +08:00
搞错了,应该是析构函数非 public,才用的。
owt5008137
2019-04-27 10:02:03 +08:00
比如说,侵入式智能指针,就得 delete this 了呀。
zhuyie
2019-04-27 10:43:09 +08:00
C++如果用引用计数来实现生命周期管理,一般都用 delete this。
farseeraliens
2019-04-27 15:52:24 +08:00
对于存在回调的情况,一种是 unique_ptr 来自动析构,一种是手动 delete this。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/559047

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX