Lambda捕获函数返回的shared_ptr是否安全?代码安全性确认
你的代码写法完全安全,无需担心对象销毁问题
shared_ptr指向的是堆上的独立副本,而非栈上的
v
在function_1中,std::make_shared<const std::vector<double>>(v)会在堆内存中创建一个全新的vector<double>对象,并把栈上局部变量v的内容完整复制到这个堆对象里。也就是说,pVec管理的是堆上的独立副本,和栈上的v没有绑定关系。当栈上的v执行完作用域被销毁时,堆上的副本完全不受影响。shared_ptr的引用计数机制保证对象存活到不再被使用
function_1返回pVec时,shared_ptr的引用计数加1;populate_op中接收返回值,引用计数再次加1;- Lambda以值方式捕获
pVec,引用计数又加1; - 当
populate_op的局部pVec销毁时,引用计数减1; - 后续
Op对象(op0、op1)被std::async复制到future中,只要future还持有这个Op,Lambda里的shared_ptr就会维持对堆对象的引用,直到future.get()执行完成、相关对象销毁后,堆上的vector才会被自动释放。
额外优化建议(不影响安全性)
function_1里可以直接跳过栈上的v,直接构造堆对象,减少一次vector复制操作:std::shared_ptr<const std::vector<double>> function_1() const { return std::make_shared<const std::vector<double>>({1.0, 2.0}); };
内容的提问来源于stack exchange,提问作者Vero
相关产品推荐
相关产品推荐

