【问题标题】:C++ primer 5 edition: Container of shared_ptrC++ 入门 5 版:shared_ptr 的容器
【发布时间】:2019-10-19 22:59:56
【问题描述】:

再次阅读 C++ Primer 5 Edition。我在第 12 章动态记忆。一切都好。直到本书的这一点:

“因为在最后一个 shared_ptr 消失之前不会释放内存,因此确保 shared_ptr 在不再需要它们后不会留下来很重要。程序将正确执行,但如果你忽略了可能会浪费内存销毁程序不需要的 shared_ptrs。shared_ptrs 在你需要它们之后可能会保留的一种方法是,如果你将 shared_ptrs 放在一个容器中,然后重新排序容器,这样你就不需要所有元素。你应该确保删除shared_ptr 元素,一旦您不再需要这些元素。

注意

如果您将 shared_ptrs 放入容器中,并且随后需要使用部分但不是全部元素,请记住删除不再需要的元素。”

  • 我不明白这一段,谁能给我解释一下shared_ptrs 怎么会泄露?以及可能导致泄漏的 shared_ptr 的“容器”示例。谢谢。

【问题讨论】:

  • 听起来类似于 C++ 的“erase-remove”习语,因为 std::remove 实际上并没有删除元素,它只是重新组织它们

标签: c++11 containers shared-ptr


【解决方案1】:

这实质上意味着只要您的容器中有std::shared_ptr 对象,它指向的对象就不会被删除。

因此,一旦您不再使用该对象,您应该从容器中删除相应的std::shared_ptr,以便释放存储空间。

如果您要继续向容器中添加元素并且从不删除任何元素,那么您实际上会泄漏内存(当引用计数达到 0 时它会被清除,但在那之前它会无缘无故地被保留)。


旁注,请确保您始终考虑使用std::shared_ptr 的时间。通常std::unique_ptr 就足够了,如果需要共享它很容易做到这一点。 见Does C++11 unique_ptr and shared_ptr able to convert to each other's type?

还有

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-unique

【讨论】:

  • 所以你的意思是没有真正的泄漏,只要它们在容器对象被销毁(超出范围)时被销毁?
  • 是的,一旦引用计数达到 0(没有更多的 shared_ptr 实例),它将删除它指向的对象。所以最坏的情况是应用程序退出时。最好的情况是容器被销毁,最好的情况是从容器中删除它不再需要它。
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2021-09-04
  • 2021-08-25
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多