2

我知道不应该使用自动指针容器,这可能会导致问题。真正的原因是什么?是否有任何其他类型的“智能”指针可以在容器中安全使用?

4

3 回答 3

11

容器元素应该是真正可复制的;auto_ptr 不是。如果您制作副本,则原件会被修改(失去所有权)。可以复制 boost::shared_ptr,因为这两个指针之后将共享所有权。因此,它可以在 STL 容器中使用。

于 2010-05-20T08:02:40.923 回答
3

问题在于auto_ptr. 当您分配两个自动指针时,RHS 会将内存的所有权让给 LHS。这意味着赋值签名是:(auto_ptr& operator=( auto_ptr& rhs )注意constRHS 中没有),所以在很多情况下它甚至不会编译。

还有其他可以与容器一起使用的智能指针。在 TR1 中有一个shared_ptr模型boost::shared_ptr(在某些编译器中,它正是刚刚复制的 boost 中的代码,并且名称空间发生了变化)。Boost 也boost::unique_ptrauto_ptr在即将推出的标准中替代它。它使用移动语义对单一所有权进行建模,以便可以在内部使用它而无需额外的使用成本shared_ptr(在大多数情况下成本并不明显)。

于 2010-05-20T08:11:44.813 回答
0

据我所知,auto_ptrs 在复制时会出现问题,因此不应在 STL 容器中使用。shared_ptrs 是你的选择。

于 2010-05-20T08:02:52.730 回答