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

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,所以流程是:

  1. inner执行到co_return后,先把自己的future标记为就绪,紧接着销毁协程帧,local对象跟着析构。
  2. 控制权回到outer协程,outer恢复执行,打印"inner done"。

这个结果和右侧的同步版本完全一致:local的析构函数会在打印"inner done"之前被调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:55:30