先触发停止请求,std::stop_callback构造时自销毁是否安全?
回答
这种情况不安全,存在明确的未定义行为,具体原因和标准依据如下:
核心问题:销毁未完成构造的对象
当std::stop_callback的构造函数接收一个已触发停止请求的stop_token时,会同步立即执行传入的回调函数。此时ControlBlock的构造过程尚未完成:ControlBlock的成员sc正在构造中,整个ControlBlock对象的生命周期还未正式启动(对象生命周期从构造函数完全执行完毕时才开始),但回调函数里直接执行了delete cb,相当于销毁了一个还在构造中的对象。对应的C++标准条款
- [basic.life]/1:对象的生命周期始于其构造函数执行完毕、且对象已完成初始化之时。
- [basic.life]/5.1:对生命周期尚未开始的对象执行销毁操作(如
delete表达式),属于未定义行为。 - [thread.stoptoken.callback.ctor]:明确规定
std::stop_callback构造时,若关联的stop_token已触发停止请求,会立即同步调用回调函数,不会延迟到构造完成后。
综上,提前调用ss.request_stop()会触发“在对象生命周期开始前销毁对象”的操作,完全符合未定义行为的判定标准。
内容的提问来源于stack exchange,提问作者zwhconst
相关产品推荐
相关产品推荐

