将boost::shared_ptr
声明为std::vector
或std::list
等容器的实际意义是什么?
以下是使用BOOST_AUTO
的示例。
void someFunction()
{
...
BOOST_AUTO(sharedPtrToContainer, boost::make_shared<std::vector<T>>());
...
}
如果您只需要本地容器,有什么意义吗?有什么好处? shared_ptr
对容器的用途是什么?
答案 0 :(得分:8)
将
boost::shared_ptr
声明为std::vector
或std::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>
,取决于大小,也可以按值返回(我估计很大程度上取决于调用者将要使用它做什么)...