C++ 多次调用make_shared()时的共享\u ptr垃圾回收

C++ 多次调用make_shared()时的共享\u ptr垃圾回收,c++,c++11,memory-leaks,shared-ptr,C++,C++11,Memory Leaks,Shared Ptr,我知道使用智能指针,如std::shared_ptr会在指针超出范围时添加垃圾收集,但如果我在一个shared_ptr上多次调用make_shared(),我不清楚垃圾收集是否也能工作 例如: std::shared_ptr<MyClass> mcPtr; void assignment(int i) { mcPtr = std::make_shared<MyClass>(i); } void main() { assignment(5); // Som

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

例如:

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 mcPtr;
无效转让(int i)
{
mcPtr=std::使_共享(i);
}
void main()
{
任务(5);
//一段时间以后
赋值(10);//这会导致内存泄漏吗?
}
使用不会添加垃圾收集,但当共享指针在作用域末尾被销毁时,将调用其析构函数中声明的共享指针。共享指针的析构函数负责释放内存

现在,当您调用
=
时,将调用。来自标准20.8.2.2.3.4

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


因此
mcPtr
被赋予新的
shared\u ptr
的值,新的
shared\u ptr
获得
mcPtr
的内容。然后新的
shared_ptr
超出范围,调用析构函数,
shared_ptr
自行处理。

“…但我不清楚垃圾收集是否也能工作…”是的,它将删除旧值,并替换为新值。另请注意,垃圾收集与使用智能指针有些不同。提供的代码不会出现内存泄漏。使用
shared\u ptr
泄漏内存的唯一方法(假设正确使用它,而没有难看的漏洞)是创建循环依赖项。重新分配给它肯定会得到妥善处理。这是一个很好的解释,谢谢!我认为新的shared_ptr将立即超出范围,因为它是一个右值,这对吗?还是等到函数结束?或者换一种说法,这会导致问题吗(假设乐观主义者没有移除它)<代码>for(;){mcPtr=make_shared();}临时对象在其所属的完整表达式末尾被销毁。更多阅读:作为旁白,这在幕后究竟是如何运作的?显然,当这些对象超出范围时,编译器会回收堆栈上的内存(以及其他临时位置,如寄存器),但调用这些对象的析构函数也有意义吗?这就是智能指针的工作原理吗?@SonicAtom是的。当对象生命周期结束时,即命名对象的作用域结束或临时对象的表达式结束,将调用对象的析构函数。这就是为什么值语义如此吸引人,就像即时自动垃圾收集一样