C++ 容器的共享ptr是什么意思?

C++ 容器的共享ptr是什么意思?,c++,boost,containers,shared-ptr,C++,Boost,Containers,Shared Ptr,向std::vector或std::list等容器声明boost::shared\u ptr的实际意义是什么 下面是一个利用BOOST\u AUTO的示例 void someFunction() { ... BOOST_AUTO(sharedPtrToContainer, boost::make_shared<std::vector<T>>()); ... } void someFunction() { ... BOOST_AUTO(sharedptrtto

std::vector
std::list
等容器声明
boost::shared\u ptr
的实际意义是什么

下面是一个利用
BOOST\u AUTO
的示例

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

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

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

std::vector<T> inst;
std::vector inst;
如果您需要返回并且
T
很重(或者向量大得离谱),那么使用
shared\u ptr
或指针向量(
T
很重而且很小),否则按值返回,例如
vector
,取决于大小,也可以按值返回(我想这在很大程度上取决于打电话的人将如何处理它)

std::vector
std::list
等容器声明
boost::shared\u ptr
的实际意义是什么

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

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

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

好处是什么?共享的ptr对容器有什么用途


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

如果您只是声明一个容器,其中包含指向堆上分配的对象的指针,如果您不小心,很容易让容器超出范围,在这一点上,内存泄漏。这是因为容器只拥有在容器中分配的类型的所有权。例如,对于
std::vector
,向量将只保留分配内存以包含一系列指针的所有权…它将不保留这些指针对象的所有权s指向。这只是因为它不能…容器如何知道它指向的是堆对象而不是其他对象?如果它指向的是堆对象,它如何知道它是该堆对象的唯一引用,并且它可以在必要时删除它而不创建一堆悬空指针事实上,因为STL容器不携带这种全局状态信息,它们不可能知道这些问题的答案,因此STL容器管理的唯一内存是它为自己控制的对象分配的内存。因此,当存储指针的容器超出范围时,用于分配指针将被正确销毁,但容器本身不会对每个指针调用
delete
,以取消分配堆上每个指针指向的对象。使用
std::shared\u ptr
作为STL容器的类型,允许容器超出范围并删除分配的内存对于数组中分配的每个
shared_ptr
。由于
shared_ptr
中存储的引用计数对象状态信息,但一旦删除了对对象的最后一个引用,它本身将正确销毁它正在管理的堆上的对象。因此,如果您有一个STL容器超出范围,该容器中的任何
shared\u ptr
都是他们指向的对象的最后一个引用,这将正确地销毁堆上的对象,并且不会导致堆对象丢失指针而导致一系列内存泄漏。

这与向任何其他对象声明
shared\u ptr
相同:您将o这是因为您希望堆上的对象,但不想手动
删除它。我认为您真正的问题是,如果只在函数中本地使用容器,那么在堆上分配容器有什么意义。您确定函数没有将指针存储在某个地方以供以后使用吗?向量/列表是否共享所有权?如果是,共享指针可能有意义。如果不是,共享指针就没有意义。@Wyzard:谢谢你展开这篇文章!谢谢你这么详细的解释,但我想问的是关于
shared\u ptr
到容器,而不是关于包含
shared\u ptr
s的容器。四票赞成解释基本常识。再听一遍R