V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
inhzus
V2EX  ›  C

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

  •  1
     
  •   inhzus · 2019-04-26 18:38:25 +08:00 · 4769 次点击
    这是一个创建于 2067 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不想往下看的话, 完整问题: 有什么使用 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 条附言  ·  2019-04-27 11:41:46 +08:00
    简单总结一下,楼上大大提到的 ATL CWindow 的 onFinalMessage 和 folly 的代码暂时还没去好好看。

    各位 V 友提到的使用场景大部分都是指“侵入式智能指针”,我在问这个问题之前有了解到这样的场景,不过并知道这个词语。那使用侵入式智能指针相比非侵入式有什么优点呢?节省内存?

    最后要说的是 智能指针的出现使得 delete this 这样的代码使用频率越来越低。

    昨天去看了看 ATL,发现是在 Windows 下才可以使用… 希望可以从 folly 中有所收获。

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

    讲道理,有了智能指针之后 delete 基本都杜绝了别说 delete this 这种了。
    macha
        8
    macha  
       2019-04-27 08:05:37 +08:00
    UI 点×时候要顺便销毁自己,所以要 delete this
    AngelCriss
        9
    AngelCriss  
       2019-04-27 08:40:58 +08:00 via Android   ❤️ 1
    你看看 folly 的代码就会发现很多 delete this 和 new (this) T 的配套
    AngelCriss
        10
    AngelCriss  
       2019-04-27 08:47:10 +08:00 via Android   ❤️ 1
    搞错了,应该是析构函数非 public,才用的。
    owt5008137
        11
    owt5008137  
       2019-04-27 10:02:03 +08:00 via Android   ❤️ 1
    比如说,侵入式智能指针,就得 delete this 了呀。
    zhuyie
        12
    zhuyie  
       2019-04-27 10:43:09 +08:00   ❤️ 1
    C++如果用引用计数来实现生命周期管理,一般都用 delete this。
    farseeraliens
        13
    farseeraliens  
       2019-04-27 15:52:24 +08:00 via iPhone   ❤️ 1
    对于存在回调的情况,一种是 unique_ptr 来自动析构,一种是手动 delete this。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   842 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:23 · PVG 05:23 · LAX 13:23 · JFK 16:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.