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
相关产品推荐
相关产品推荐

