return std::shared_ptr 的向量安全吗?
Is it safe to return a vector of std::shared_ptr?
我的代码是否存在内存泄漏的风险以返回 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;
}
是的,这是安全且无内存泄漏的。您的 test
函数创建了指针,它们的引用计数都为 1。一旦函数 returns,它们被复制到 b
中,这增加了引用计数,然后它们超出范围并将引用计数减少回 1。A
全部被清除在 main
.
结束时正确向上
在 ~A
中放置一个断点(或 cout
语句)应该也能正确显示。最后一个小提示,你应该更喜欢 make_shared
而不是 new
我的代码是否存在内存泄漏的风险以返回 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;
}
是的,这是安全且无内存泄漏的。您的 test
函数创建了指针,它们的引用计数都为 1。一旦函数 returns,它们被复制到 b
中,这增加了引用计数,然后它们超出范围并将引用计数减少回 1。A
全部被清除在 main
.
在 ~A
中放置一个断点(或 cout
语句)应该也能正确显示。最后一个小提示,你应该更喜欢 make_shared
而不是 new