C++中shared_ptr通过operator=进行内存释放的机制及代码运行疑问
嘿,我来帮你理清这个困惑~ 你对shared_ptr的核心机制理解有一点点偏差,咱们一步步拆解:
首先,shared_ptr的核心是引用计数:它会维护一个计数器,记录当前有多少个shared_ptr实例共同持有同一个对象。只有当这个计数器降到0的时候,对象才会被销毁并释放内存。
回到你的代码:
- 当你创建
P1(new Rectangle(10, 5))时,引用计数是1——只有P1拿着这个Rectangle对象的“所有权”。 - 执行
P2 = P1的时候,并不是让P1释放对象,而是让P2也加入到共享这个对象的行列中。这时候引用计数会从1增加到2,现在P1和P2都是这个对象的合法持有者。
这就是为什么你之后还能调用P1->area():P1仍然指向那个Rectangle对象,它并没有因为赋值给P2就失去对对象的访问权。你代码里最后一行的P1.use_count()输出的是2,这也直接证明了此时有两个shared_ptr在共享这个对象。
你之前的误解可能混淆了shared_ptr和unique_ptr的行为:unique_ptr是独占所有权的,用std::move转移后原指针就失效了,但shared_ptr是共享所有权的,赋值操作只会增加引用计数,不会让原指针失去访问能力。
只有当以下情况发生时,对象才会被释放:
- 最后一个持有该对象的
shared_ptr被销毁(比如main函数结束时,P1和P2都会被销毁,此时引用计数降到0,Rectangle对象才会被销毁) - 最后一个持有该对象的
shared_ptr被operator=赋予新的指针,或者调用reset()
内容的提问来源于stack exchange,提问作者Srihari Kaashyap
相关产品推荐
相关产品推荐

