gpt4 book ai didi

c++ - 访问其用户定义的析构函数已启动但未完成的对象真的是 UB 吗?

转载 作者:行者123 更新时间:2023-12-05 09:35:50 25 4
gpt4 key购买 nike

问题是由于 a discussion on Reddit 引起的,一位用户告诉我,引用标准关于对象生命周期的规则:

I'm pretty certain that it is technically UB to access an object, while it is being destructed.

例如,我依赖于管理后台线程的类;我让他们的析构函数通知线程退出并等待它退出,并且该线程可以访问该对象。我需要重构我的代码吗?

最佳答案

不,它定义明确。

如果在对象的析构函数正在执行时完全无法访问该对象,那么该析构函数本身将无法对其自己的对象执行任何操作。 😜


在你的析构函数执行期间:

  • 基地还没有被摧毁
  • “当前”对象本身还没有被破坏(它的成员也没有)
  • 一些资源可能已经被释放,如果你已经在你的析构函数中这样做了
  • 派生子对象已被销毁
    • 虚拟函数调用将安全地引用“当前”对象,而不是这些现已失效的派生子对象
    • dynamic_casttypeid 会做同样的事情
    • 但是,您不能使用 Derived* 执行任何这些操作!通过 Base*Current* 即可

[class.cdtor] 涵盖了这些规则中的大部分内容.


虽然对象的生命周期确实在技术上结束于析构函数“调用”的开始,但此时你处于一种炼狱中,[class.cdtor] 接管上面列出的规则:

[basic.life/7]: [..] after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any glvalue that refers to the original object may be used but only in limited ways. For an object under construction or destruction, see [class.cdtor]. [..]

它可能是一种容易出错且令人困惑的模式,但它本身并不是不正确的。对于您的特定用例,我什至会称其为相当传统的。

关于c++ - 访问其用户定义的析构函数已启动但未完成的对象真的是 UB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65598138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com