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

std::future会在执行完成后保留std::async的lambda及捕获对象吗?

std::future与lambda及捕获对象的生命周期问题

示例代码

#include <vector>
#include <future>
#include <memory>
struct S {
  std::string mName = "";
};

std::vector<std::future<void>> futures;
int main(){
  {
    auto s = std::make_shared<S>();
    futures.emplace_back(std::async([s2=s]{}));
  }
  // 假设async执行完成,s2此时是否还存活?
}

问题解答

  • std::future不会保留lambda的生命周期:std::async启动的异步任务执行完成后,作为任务主体的lambda对象会立即销毁,不受对应的std::future是否存在的影响。
  • lambda及按值捕获的对象在任务完成后销毁:lambda按值捕获的s2是原shared_ptr<S>的拷贝,它作为lambda的成员变量,会随lambda一起在任务执行完毕后被销毁。此时s2的引用计数减一,若原shared_ptr<S>(即代码中的s)已在作用域结束时销毁,那么S对象的引用计数会变为0,进而被自动释放。

标准依据

根据C++标准中std::async的规范:

std::async会将可调用对象(此处为lambda)的副本存储到与返回的std::future关联的共享状态中。该可调用对象会被异步执行,执行完成后共享状态进入就绪状态,但可调用对象的副本会在执行结束后立即销毁,不会因std::future的存在而留存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:29:51