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
自行处理。
我知道使用像 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
自行处理。