在对象的用户自定义析构函数已启动但未完成时访问对象是否真的属于未定义行为(UB)?
问题背景
这个技术议题最早源于C技术社区的公开讨论,当时有参与讨论的用户结合C标准中关于对象生命周期的规则给出明确判断:
我可以非常确定,从技术规范层面看,在对象处于析构过程中访问该对象属于未定义行为(UB)。
常见开发场景
实际编码过程中,开发者经常会碰到需要依赖对象析构时序的设计需求,管理后台线程的类就是最典型的场景:
- 这类类的常规实现逻辑为:在析构函数阶段,向绑定的后台线程发送退出信号,随后阻塞等待线程完全执行终止流程
- 实现中存在明确的时间窗口:析构函数发出退出信号后,到后台线程完全退出前的等待阶段,线程仍然有可能访问当前类的实例对象
核心疑问
按照C++标准的规范要求,上述这种非常通用的后台线程管理实现,是否真的属于未定义行为的触发场景?现有这种依赖析构时序的代码是否必须重构?
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

