我知道不应该使用自动指针的容器,这可能会导致问题。这是什么原因?是否有其他类型的“智能”指针可以安全地在容器中使用?
答案 0 :(得分:11)
容器元素应该是真正可复制的; auto_ptr不是。如果您制作副本,则会修改原件(它将失去所有权)。可以复制boost :: shared_ptr,因为之后两个指针将共享所有权。因此,它可以用在STL容器中。
答案 1 :(得分:3)
问题在于auto_ptr
中的复制语义。当您分配两个自动指针时,RHS将为LHS产生内存的所有权。这意味着赋值签名是:auto_ptr& operator=( auto_ptr& rhs )
(注意RHS中没有const
),所以在很多情况下它甚至都不会编译。
还有其他可以与容器一起使用的智能指针。在TR1中有一个shared_ptr
在boost::shared_ptr
之后建模(在一些编译器中,它恰好是刚刚复制的boost中的代码,并且命名空间已更改)。 Boost还有boost::unique_ptr
,它将成为即将推出的标准中auto_ptr
的替代品。它使用移动语义模拟单一所有权,以便可以在内部使用,而无需使用shared_ptr
的额外成本(在大多数情况下,成本是显而易见的)。
答案 2 :(得分:0)
据我所知,auto_ptrs在复制时有问题,因此不应在STL容器中使用。 shared_ptrs是您的选择。