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

shared_ptr是否总能自动释放内存?改造后的代码会内存泄漏吗?

你的代码不会内存泄漏,但reset循环纯属多余

先给结论:这段改造后的代码不会出现内存泄漏,但后面那段遍历调用reset()的循环完全没必要,甚至起不到你想要的作用。

为什么不会泄漏?

当你把CreateFactory返回的裸指针通过emplace_back放进std::vector<std::shared_ptr<Interface>>时,shared_ptr已经接管了这块内存的所有权。只要CreateFactory是用标准new分配的对象(工厂函数通常都是这么做的),shared_ptr就会在自身生命周期结束时自动调用delete释放内存——比如当interface_list容器离开作用域被销毁时,容器里的所有shared_ptr会逐个析构,它们指向的内存都会被正确释放。

为什么reset循环没用?

你写的遍历代码是:

for (std::shared_ptr<Interface> it: interface_list) {
  it.reset();
}

这里的it是容器中每个shared_ptr的副本,你对副本调用reset(),只是让这个临时副本放弃了对内存的引用,容器里的原shared_ptr依然持有内存的所有权。等循环结束,临时的it销毁,但原容器里的shared_ptr该咋样还咋样,完全没达到提前释放内存的目的。

优化建议

  • 直接删掉那个reset循环,纯纯的无用代码。
  • 可以把代码改得更安全,避免裸指针存在的时间太长:
std::vector<std::shared_ptr<Interface>> interface_list;

for (int i = 0 ; i < 5; ++i) {
  if (Interface* buffer = CreateFactory(i)) {
    interface_list.emplace_back(buffer);
    // 或者写成 interface_list.push_back(std::shared_ptr<Interface>(buffer)); 效果一样
  }
}

这样裸指针buffer的生命周期被限制在if块里,更符合RAII原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:20:25