自动指针的容器

时间:2010-05-20 07:56:19

标签: c++ stl auto-ptr

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

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

还有其他可以与容器一起使用的智能指针。在TR1中有一个shared_ptrboost::shared_ptr之后建模(在一些编译器中,它恰好是刚刚复制的boost中的代码,并且命名空间已更改)。 Boost还有boost::unique_ptr,它将成为即将推出的标准中auto_ptr的替代品。它使用移动语义模拟单一所有权,以便可以在内部使用,而无需使用shared_ptr的额外成本(在大多数情况下,成本是显而易见的)。

答案 2 :(得分:0)

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