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

未调用get()时std::shared_future的内存分配及内存泄漏问题

关于std::shared_future未调用get()就退出的行为与内存泄漏问题

核心行为分析

当你用std::launch::async策略调用std::async时,返回的std::shared_future对象在析构时(比如程序执行到return 0退出,局部变量sharedFutures被销毁),会阻塞当前线程,直到异步任务myAsyncFunc执行完毕。这是C++标准对std::async配合launch::async的硬性规定,目的是避免异步任务成为无主的孤儿线程。

内存泄漏的判定

是否会出现内存泄漏,完全取决于myAsyncFunc内部的内存分配逻辑:

  • 如果myAsyncFunc返回的double*指向栈内存(比如局部变量的地址),不存在泄漏,但这种写法本身就是错误的——栈内存会在myAsyncFunc执行完毕后被自动销毁,后续哪怕调用get()拿到指针也是野指针。
  • 如果myAsyncFunc返回的double*是用new/malloc分配的堆内存,那么当你未调用sharedFutures.get()时,这个指针会被shared_future的内部存储持有,直到shared_future析构。但shared_future只会销毁自己的内部结构,不会主动释放这个指针指向的堆内存——因为它无法判断指针的所有权归属。这种情况下,这块堆内存会永久丢失,造成内存泄漏。

补充:代码中的明显错误

你的代码存在一个编译级逻辑错误:sharedFutures是单个std::shared_future<double*>对象,并非可迭代容器,所以for (sharedFuture : sharedFutures )这段代码无法通过编译。如果需要处理多个异步任务的结果,应该把shared_future实例存入std::vector或其他容器中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:15:31