我想知道是否有必要为程序中的每个std :: shared_ptr实例调用reset()以便释放内存?即没有std :: shared_ptr的实例指向它时释放内存,尽管其中一些实例在被销毁之前没有调用reset()?
例如,如果我们有一个像:
这样的函数void func()
{
std::shared_ptr<int> p1(new int(5));
std::shared_ptr<int> p2 = p1; //Both now own the memory.
p1.reset(); //Memory still exists, due to p2.
}
当函数完成并且p1和p2被破坏时,尽管没有调用p2的reset(),是否释放了内存?
答案 0 :(得分:2)
答案是肯定的。您可以使用以下简单程序轻松验证答案。
#include <iostream>
#include <memory>
struct A
{
~A() { std::cout << "Came to A::~A()\n";}
};
int main()
{
std::shared_ptr<A> p1(new A);
std::shared_ptr<A> p2 = p1;
std::shared_ptr<A> p3 = p2;
return 0;
}
这是我运行程序时得到的结果。
Came to A::~A()
答案 1 :(得分:1)
不,没有必要致电reset()
。在共享指针的所有实例超出范围后,将释放内部指向的内存。 reset函数仅重置调用它的实例。在此处阅读:http://www.cplusplus.com/reference/memory/shared_ptr/