我们都知道RAW指针需要包含在某种形式的智能指针中以获得Exception安全内存管理。但是当涉及指针容器时,问题变得更加棘手。
std容器坚持包含的对象是可复制的,所以这排除了使用std :: auto_ptr,尽管你仍然可以使用boost :: shared_ptr等。
但是也有一些明确设计的增强容器可以安全地保存指针:
见Pointer Container Library
问题是: 我应该在什么条件下使用ptr_containers而不是smart_pointers容器?
boost::ptr_vector<X>
or
std::vector<boost::shared_ptr<X> >
答案 0 :(得分:13)
Boost指针容器对其拥有的资源拥有严格的所有权。 std :: vector&lt; boost :: shared_ptr&lt; X&gt;&gt;拥有共享权。有理由说明为什么这可能是必要的,但如果不是,我会默认使用boost :: ptr_vector&lt; X&gt;。 YMMV。
答案 1 :(得分:3)
稳定:智能指针是处理资源管理的一种非常好的方法,但不是唯一的方法。我同意你会在编写良好的C ++代码中看到很少的原始指针,但根据我的经验,你也没有看到很多智能指针。使用原始指针容器实现了许多完全异常安全的类。
答案 2 :(得分:2)
嗯,开销是一个案例。
共享指针的向量将执行大量无关的复制,包括在调整大小上创建新的智能指针,递增引用,递减引用等。使用指针容器可以避免所有这些。
需要进行性能分析以确保容器操作是瓶颈但是:)