C++ 中 delete this 有什么必要的应用场景? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
inhzus
V2EX    C

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

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

    不想往下看的话, 完整问题: 有什么使用 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     Solana     5169 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:23 PVG 17:23 LAX 02:23 JFK 05:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86