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

#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;
}

最佳答案

是的,这是安全且无内存泄漏的。您的test函数创建了指针,它们的引用计数均为1。函数返回后,将它们复制到b中,这会增加引用计数,然后超出范围并将引用计数减小至1。A都在main末尾正确清除。

cout中放置一个断点(或~A语句)也应该正确地向您显示。最后一点注意事项,您应该首选make_shared而不是new

10-04 14:17