【问题标题】:What is the sense of a shared_ptr to a container?shared_ptr 对容器的意义是什么?
【发布时间】:2023-03-04 01:57:01
【问题描述】:

向std::vector 或std::list 之类的容器声明boost::shared_ptr 究竟有什么意义?

这是一个使用 BOOST_AUTO 的示例。

void someFunction()
{
  ...
  BOOST_AUTO(sharedPtrToContainer, boost::make_shared<std::vector<T>>());
  ...
}

如果你只需要本地的容器有什么意义吗?有什么好处? shared_ptr 对容器有什么用处?

【问题讨论】:

  • 这与向其他任何东西声明shared_ptr 相同:您这样做是因为您想要堆上的对象但不想手动delete 它。我认为您真正的问题是,如果容器仅在函数中本地使用,那么在堆上分配容器有什么意义。您确定该函数不会将指针存储在某处以供以后使用吗?
  • 向量/列表是否共享所有权?如果是这样,共享指针可能有意义。如果不是,则共享指针没有意义。
  • @Wyzard:谢谢你展开这个!

标签: c++ boost containers shared-ptr


【解决方案1】:

向std::vector 或std::list 之类的容器声明boost::shared_ptr 究竟有什么意义?

与使用指向任何对象类型的共享指针完全相同;它允许您与其他范围共享对象的所有权。对象恰好是一个容器并没有什么区别。

如果你只需要本地的容器有什么意义吗?

没有;如果你只需要在本地,那么它应该是一个普通的自动对象。

有什么好处? shared_ptr 对容器有什么用处?

如果您需要将它的生命周期延长到当前范围之外,那么您需要动态地创建和销毁它,然后它的生命周期应该由智能指针管理。

【讨论】:

  • 四个赞成票用于解释基本常识。再来一个!
【解决方案2】:

如果你只是简单地声明一个容器,里面装满了指向在堆上分配的对象的指针,如果你不小心的话,很容易让容器超出范围,这时就会发生内存泄漏。这是因为容器只拥有容器中分配的类型的所有权。例如,对于std::vector&lt;T*&gt;,向量只会维护分配内存以包含一系列指针的所有权......它不会维护这些指针指向的对象的所有权。这仅仅是因为它不能......容器如何知道它指向的是一个堆对象而不是其他东西?如果它指向一个堆对象,它怎么知道它是对该堆对象的唯一引用,并且它可以在必要时删除它而不创建一堆悬空指针?现实是因为 STL 容器不携带那种全局状态信息,它们不可能知道这些问题的答案,因此 STL 容器管理的唯一内存是它为其自己的对象分配的内存控制。因此,当存储指针的容器超出范围时,用于分配指针的内存将被正确销毁,但容器本身不会在每个指针上调用 delete 以释放每个指针指向的对象堆。使用 std::shared_ptr&lt;T&gt; 作为 STL 容器的类型允许容器超出范围并删除为数组中分配的每个 shared_ptr 分配的内存。由于存储在shared_ptr 中的引用计数对象状态信息,一旦对对象的最后一个引用被删除,它本身就会正确地销毁它正在管理的堆上的对象。因此,如果您有一个超出范围的 STL 容器,那么该容器中的任何 shared_ptrs 是对它们指向的对象的最后引用都会正确地销毁堆上的对象,并且您不会结束由于指针丢失到堆对象而导致一系列内存泄漏。

【讨论】:

  • 感谢您提供如此详尽的解释,但我问的是关于 shared_ptr 的容器,而不是关于包含 shared_ptrs 的容器。
【解决方案3】:

如果你只需要在本地,那么使用自动实例:

std::vector<T> inst;

如果您需要返回并且T 很重(或向量非常大),则使用shared_ptr 或指针向量(T 很重且很小),否则按值返回,例如例如vector&lt;int&gt;,根据大小,也可以按值返回(我想很大程度上取决于调用者将要做什么)...

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 2012-09-27
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2015-03-22
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多