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是的。当对象生命周期结束时,即命名对象的作用域结束或临时对象的表达式结束,将调用对象的析构函数。这就是为什么值语义如此吸引人,就像即时自动垃圾收集一样