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

循环中创建std::unique_ptr出现对象内存地址重复问题问询

问题原因解答

你观察到的内存地址重复是C++标准库堆内存分配器的正常复用行为,不属于程序BUG,具体逻辑如下:

  • 首先看对象生命周期:for循环体内部定义的std::shared_ptr<UniquePtrTest> sptr是单次循环的局部变量,每次循环迭代结束时,sptr就会离开作用域,其持有的对象引用计数归零,UniquePtrTest实例会被自动销毁,对应的堆内存会被内存分配器回收,标记为空闲状态。
  • 其次是内存分配的优化逻辑:标准库内置的内存分配器为了提升分配效率、减少内存碎片,会优先将刚回收的、大小完全匹配当前申请需求的空闲内存块返回给新的分配请求。你的UniquePtrTest类占用内存大小固定,每次std::make_unique申请的内存大小一致,所以刚被回收的内存块会被反复分配给新创建的对象,就出现了地址重复的现象。
  • 前两次单独创建的对象地址不重复的原因:你在main函数层级定义的sptr1、sptr2会在整个main函数运行期间保持存活,它们持有的对象内存不会被释放,自然不会被后续的分配请求复用。

如果要验证这个逻辑,可以手动延长循环内对象的生命周期:在循环外部定义一个std::vector<std::shared_ptr<UniquePtrTest>>容器,每次循环创建完sptr后将其存入容器,这样所有对象在循环结束前都不会被销毁,内存地址就不会出现重复。


内容的提问来源于stack exchange,提问作者warden2018

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:07