当指向它的std :: shared_ptr的所有实例都被销毁时,数据是否被释放?

时间:2014-03-19 06:04:27

标签: c++ pointers c++11

我想知道是否有必要为程序中的每个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(),是否释放了内存?

2 个答案:

答案 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/