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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:50:43