C++协程中co_return时局部对象析构函数的调用时机问询
C++协程中co_return时局部对象的析构时机
普通C函数里,执行return时,作用域内的局部对象会在控制权返回调用方之前析构。放到C协程里,执行co_return时局部对象的析构时机,核心看协程的最终挂起行为,规则如下:
- 协程走到
co_return时,先完成收尾逻辑(比如把返回对象标记为就绪),然后进入最终挂起状态——这个状态由协程promise的final_suspend()方法决定。 - 如果
final_suspend()返回std::suspend_never(像std::future这类标准协程返回类型,默认都是这个行为),协程帧会立刻销毁,作用域内所有局部对象按构造逆序析构,之后控制权才会回到调用方(或者恢复等待该协程的外层协程)。 - 如果
final_suspend()返回std::suspend_always,协程帧会被保留,局部对象不会马上析构,直到协程帧被显式销毁(比如对应的返回对象被销毁时)。
嵌套协程示例的实际行为
看给出的嵌套协程代码:
// 协程版本 future<> inner() { Foo local; co_return; } future<> outer() { co_await inner(); cerr << "inner done\n"; co_return; }
在标准std::future的协程实现下,inner协程的final_suspend()会返回std::suspend_never,所以流程是:
inner执行到co_return后,先把自己的future标记为就绪,紧接着销毁协程帧,local对象跟着析构。- 控制权回到
outer协程,outer恢复执行,打印"inner done"。
这个结果和右侧的同步版本完全一致:local的析构函数会在打印"inner done"之前被调用。
内容的提问来源于stack exchange,提问作者Spongman
相关产品推荐
相关产品推荐

