容器中的智能指针如std :: vector?

nac*_*o4d 19 c++ pointers smart-pointers std auto-ptr

我正在学习有关智能指针(std::auto_ptr),只是看这里这里是智能指针(std::auto_ptr)不应该在容器(即放std::vector),因为即使大多数编译器不会抱怨,这似乎是正确的.没有规则说智能指针不会在内部复制(vector例如按类)并传输其所有权,然后指针将变为NULL.最后,一切都会搞砸.

实际上,这种情况多久发生一次?

有时我有指针的向量,如果在将来我决定我想要一个智能指针的矢量我会选择什么?

我知道C++ 0x和Boost库,但是现在,我更倾向于坚持使用STL方法.

wil*_*ell 16

是的,你真的不能使用std::auto_ptr标准容器.std::auto_ptr副本不等同,并且因为允许标准容器(和算法)随意复制它们的元素,这会搞砸.也就是说,复制的操作std::auto_ptr具有的意义不是一个对象的纯粹副本:它意味着转让所有权.

你的选择是:

  1. 使用Boost Smart Pointers库.这可以说是你最好的选择.
  2. 使用原始指针.只要你正确地管理指针,这是快速和安全的.有时这可能很复杂或困难.例如,您必须自己处理(避免)双重删除问题.
  3. 使用您自己的引用计数智能指针.那太傻了; 使用Boost智能指针.

  • 如果你是支持它的编译器,`unique_ptr`也是一个选项. (8认同)
  • 不要忘记boost的'ptr_vector`等. (3认同)
  • 我强烈反对`shared_ptr`是最佳选择的想法.我认为它们是最后的选择,因为共享所有权带来了许多问题,因为它们终身不确定:是的,只要你需要它,它就会活着,但它也可能比这更长久,特别是如果你无意中创建一个引用循环...... (2认同)

ron*_*nag 9

您所指的问题涉及auto_ptr,因为它会移动副本的所有权.shared_ptr和unique_ptr可以很好地处理容器.