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
相关产品推荐
相关产品推荐

