未调用get()时std::shared_future的内存分配及内存泄漏问题
核心行为分析
当你用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
相关产品推荐
相关产品推荐

