对容器的shared_ptr有什么意义?

时间:2011-08-15 13:23:59

标签: c++ boost containers shared-ptr

boost::shared_ptr声明为std::vectorstd::list等容器的实际意义是什么?

以下是使用BOOST_AUTO的示例。

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

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

3 个答案:

答案 0 :(得分:8)

  

boost::shared_ptr声明为std::vectorstd::list等容器的实际意义是什么?

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

  

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

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

  

有什么好处? shared_ptr对容器的用途是什么?

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

答案 1 :(得分:2)

如果你只是声明一个容器指向堆上分配的对象的指针,那么如果你不小心,允许容器超出范围就很容易,那时你就会有内存泄漏。这是因为容器仅获取容器中分配的类型的所有权。例如,对于std::vector<T*>,向量只保留分配内存的所有权以包含一系列指针......它不会保持指针所指向的对象的所有权。这只是因为它不能......容器如何知道它指向堆对象而不是其他东西?如果它指向一个堆对象,它怎么会知道它是对该堆对象的唯一引用,它可以在必要时删除它而不是创建一堆悬空指针?实际情况是因为STL容器不携带那种全局状态信息,他们不可能知道这些问题的答案,因此STL容器管理的唯一内存是它为自己的对象分配的内存。控制。因此,当存储指针的容器超出范围时,用于分配指针的内存将被正确销毁,但容器本身不会在每个指针上调用delete来解除分配每个指针指向的对象在堆上。使用std::shared_ptr<T>作为STL容器的类型允许容器超出范围并删除为数组中分配的每个shared_ptr分配的内存。由于存储在shared_ptr内的引用计数对象状态信息,一旦删除了对象的最后一个引用,它本身就会正确地销毁它正在管理的堆上的对象。因此,如果你有一个超出范围的STL容器,那个容器中对它们所指向的对象的最后一个引用的任何shared_ptrs都会正确地破坏堆上的对象,你就不会最终导致一堆内存泄漏,指针丢失到堆对象。

答案 2 :(得分:0)

如果您只在本地使用它,请使用自动实例:

std::vector<T> inst;

如果你需要返回并且T很重(或者矢量非常大),那么使用shared_ptr或指针向量(T很重且很小),否则按值返回,例如vector<int>,取决于大小,也可以按值返回(我估计很大程度上取决于调用者将要使用它做什么)...