我们都知道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> >
有帮助吗?

解决方案

Boost指针容器对其拥有的资源拥有严格的所有权。 std :: vector <!> lt; boost :: shared_ptr <!> lt; X <!> gt; <!> gt;拥有共享权。有理由说明为什么这可能是必要的,但如果不是,我会默认使用boost :: ptr_vector <!> lt; X <!> gt;。 YMMV。

其他提示

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

嗯,开销是一个案例。

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

需要进行性能分析以确保容器操作是瓶颈但是:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top