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

shared_ptr garbage collection when make_shared() is called multiple times

我知道使用像 std::shared_ptr 这样的智能指针会在指针超出范围时添加垃圾回收,但我不清楚如果我调用 [=14= 垃圾回收是否也有效]多次 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?
}

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

现在,当您调用 = 时,会调用 std::shared_ptr::operator=()。来自标准 20.8.2.2.3.4

Effect: Equivalent to shared_ptr(std::move(r)).swap(*this)

所以mcPtr被赋予了新的shared_ptr的值,而新的shared_ptr得到了mcPtr的内容。然后新的 shared_ptr 超出范围,调用析构函数并且 shared_ptr 自行处理。