【问题标题】:Is it safe to return a vector of std::shared_ptr?返回 std::shared_ptr 的向量是否安全?
【发布时间】:2020-03-09 22:42:17
【问题描述】:

我的代码是否存在因返回 std::shared_ptr 向量而导致内存泄漏的风险?我认为这是安全的,因为在 main 函数结束之前引用计数不会为零。我说的对吗?

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class A {
    public:
    A(int v):a(v){}
    int a;
};

typedef std::shared_ptr<A> APtr;

vector<APtr> test() {
    APtr x(new A(1));
    APtr y(new A(2));
    APtr z(new A(3));
    APtr a(new A(4));
    return vector<APtr>({x, y, z, a});
}

int main()
{
   cout << "Hello World" << endl; 
   vector<APtr> b = test();
   for(auto k : b) {
       cout << k->a << "\n";
   }
   return 0;
}

【问题讨论】:

    标签: c++ memory-leaks shared-ptr


    【解决方案1】:

    是的,这是安全且无内存泄漏的。您的 test 函数创建了指针,它们的引用计数都为 1。一旦函数返回,它们就会被复制到b 中,这会增加引用计数,然后它们会超出范围并将引用计数减少回1。A 在@987654324 结束时都被正确清理@。

    ~A 中放置一个断点(或cout 语句)也应该能正确显示这一点。最后一点,你应该更喜欢make_shared 而不是new

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2021-09-27
      • 2016-10-26
      • 2014-01-05
      • 2013-05-21
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      相关资源
      最近更新 更多