不想往下看的话, 完整问题: 有什么使用 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, 异常冗余, 或难以实现功能.
1
shylockhg 2019-04-26 19:00:06 +08:00
无卵用
|
2
reeonce 2019-04-26 19:05:25 +08:00 via iPhone
翻译成“自杀”,就很好理解了吧。
|
3
ArchVile 2019-04-26 19:06:42 +08:00 1
C++界面开发窗口类中,最后一条消息函数是 FinalMessage,通常都会调用 delete this 删除自己
|
4
ArchVile 2019-04-26 19:07:38 +08:00
|
5
ccpp132 2019-04-26 19:08:32 +08:00 via Android 1
很多年前用过,不过现在都是智能指针,delete 都没怎么用了。c++里大部分功能都有替代用法,没什么必须的
|
6
robot9 2019-04-26 23:35:14 +08:00 1
在 async 的 call 的时候 可以把 resource 的指针放在 callback 里删掉
|
7
yujincheng08 2019-04-27 00:36:15 +08:00 via Android 1
有时候,可以在抛出异常前把自己释放掉。
讲道理,有了智能指针之后 delete 基本都杜绝了别说 delete this 这种了。 |
8
macha 2019-04-27 08:05:37 +08:00
UI 点×时候要顺便销毁自己,所以要 delete this
|
9
AngelCriss 2019-04-27 08:40:58 +08:00 via Android 1
你看看 folly 的代码就会发现很多 delete this 和 new (this) T 的配套
|
10
AngelCriss 2019-04-27 08:47:10 +08:00 via Android 1
搞错了,应该是析构函数非 public,才用的。
|
11
owt5008137 2019-04-27 10:02:03 +08:00 via Android 1
比如说,侵入式智能指针,就得 delete this 了呀。
|
12
zhuyie 2019-04-27 10:43:09 +08:00 1
C++如果用引用计数来实现生命周期管理,一般都用 delete this。
|
13
farseeraliens 2019-04-27 15:52:24 +08:00 via iPhone 1
对于存在回调的情况,一种是 unique_ptr 来自动析构,一种是手动 delete this。
|