2008-09-22 91 views
11

我们都知道,RAW指针需要被包裹在某种形式的智能指针来获得异常安全内存管理。但是当谈到容器的指针时,问题变得更加棘手。指针和容器

集装箱坚持所包含的对象是可复制性病因此这排除了使用std :: auto_ptr的,虽然你仍然可以使用boost :: shared_ptr的等

但也有明确设计一些提升容器安全地持有指针:
Pointer Container Library

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

boost::ptr_vector<X> 

or 

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

回答

13

升压指针容器有超过其所持有的资源,严格的所有权。 std :: vector < boost :: shared_ptr < X >>拥有共享所有权。有些原因可能是必要的,但如果不是,我会默认提升:: ptr_vector < X>。因人而异。

1

那么,开销是一种情况。

共享指针的矢量会做很多外来复制的是涉及创建一个新的智能指针,递增参考,递减的引用,等在一个调整大小。所有这些都可以通过指针容器来避免。

需要分析,以确保集装箱业务是瓶颈虽然:)

3

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

+0

这是可能的,有时是最好的选择,但如果一个类包含2个或更多的RAW指针使它异常安全是不平凡。但我不应该回答你的问题,因此我应该标记你。 – 2008-09-22 17:21:43