11

我们都知道 RAW 指针需要包装在某种形式的智能指针中才能获得 Exception 安全的内存管理。但是当涉及到指针容器时,问题变得更加棘手。

std 容器坚持包含的对象是可复制的,因此这排除了 std::auto_ptr 的使用,尽管您仍然可以使用 boost::shared_ptr 等。

但也有一些 boost 容器明确设计用于安全地保存指针:
请参阅指针容器库

问题是:在什么情况下我应该更喜欢使用 ptr_containers 而不是 smart_pointers 容器?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
4

3 回答 3

13

Boost 指针容器对其拥有的资源拥有严格的所有权。std::vector<boost::shared_ptr<X>> 具有共享所有权。有必要这样做是有原因的,但如果不是,我会默认使用 boost::ptr_vector<X>。YMMV。

于 2008-09-22T16:50:44.417 回答
3

稳定:智能指针是处理资源管理的一种非常好的方法,但不是唯一的方法。我同意您会在编写良好的 C++ 代码中看到很少的原始指针,但根据我的经验,您也不会看到那么多智能指针。有许多使用原始指针容器实现的完全异常安全的类。

于 2008-09-22T16:58:45.597 回答
2

好吧,开销是一种情况。

共享指针向量将执行大量无关的复制,包括在调整大小时创建新的智能指针、增加引用、减少引用等。使用指针容器可以避免所有这些。

需要分析以确保容器操作是瓶颈:)

于 2008-09-22T16:49:23.450 回答