多次调用make_shared()时的shared_ptr垃圾回收

时间:2015-09-15 14:44:28

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

我知道使用像std::shared_ptr这样的智能指针会在指针超出范围时添加垃圾收集,但是如果我调用make_shared()多个,我还不清楚垃圾收集是否也有效一次shared_ptr上的时间。

例如:

std::shared_ptr<MyClass> mcPtr;

void assignment(int i)
{
  mcPtr = std::make_shared<MyClass>(i);
}

void main()
{
  assignment(5);

  // Some time later

  assignment(10);  // Does this cause a memory leak?
}

1 个答案:

答案 0 :(得分:2)

使用std::shared_ptr不会添加垃圾收集,但是当在范围的末尾销毁共享指针时,会在其中声明它的析构函数将被调用。共享指针的析构函数处理释放内存。

现在,当您致电= std::shared_ptr::operator=()时从标准20.8.2.2.3.4

  

效果:相当于shared_ptr(std::move(r)).swap(*this)

因此,mcPtr获得新shared_ptr的值,新shared_ptr获取mcPtr的内容。然后新shared_ptr超出范围,调用析构函数,shared_ptr自行处理。