You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中shared_ptr通过operator=进行内存释放的机制及代码运行疑问

关于shared_ptr赋值后仍能访问原指针的疑问解答

嘿,我来帮你理清这个困惑~ 你对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:02:46