You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

先触发停止请求,std::stop_callback构造时自销毁是否安全?

回答

这种情况不安全,存在明确的未定义行为,具体原因和标准依据如下:

  1. 核心问题:销毁未完成构造的对象
    当std::stop_callback的构造函数接收一个已触发停止请求的stop_token时,会同步立即执行传入的回调函数。此时ControlBlock的构造过程尚未完成:ControlBlock的成员sc正在构造中,整个ControlBlock对象的生命周期还未正式启动(对象生命周期从构造函数完全执行完毕时才开始),但回调函数里直接执行了delete cb,相当于销毁了一个还在构造中的对象。

  2. 对应的C++标准条款

  • [basic.life]/1:对象的生命周期始于其构造函数执行完毕、且对象已完成初始化之时。
  • [basic.life]/5.1:对生命周期尚未开始的对象执行销毁操作(如delete表达式),属于未定义行为。
  • [thread.stoptoken.callback.ctor]:明确规定std::stop_callback构造时,若关联的stop_token已触发停止请求,会立即同步调用回调函数,不会延迟到构造完成后。

综上,提前调用ss.request_stop()会触发“在对象生命周期开始前销毁对象”的操作,完全符合未定义行为的判定标准。


内容的提问来源于stack exchange,提问作者zwhconst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:05:23