使用std::unique_ptr与标准容器

7

我一直在寻找一种安全的方法来处理动态指针的向量和映射,当我意识到C++11添加了unique_ptr时,我开始研究如何使用它们。我在Google上查找了如何使用它们的方法,但是没有找到详细信息。我需要知道以下内容:

  1. 除了自动内存收集之外,指针和unique_ptr之间有什么不同?
  2. 如何从向量或映射中移除一个unique_ptr?除了擦除迭代器之外,是否需要使用任何特殊代码?

1
unique_ptr是必要条件吗? 如果安全是您的目的,std::shared_ptr可能是一种替代方案。 - Ise Wisteria
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
13
  1. unique_ptr只是指针的一个包装器,当销毁unique_ptr时会删除指针。它没有额外开销(就像被它取代的auto_ptr模板一样)。
  2. 不会有问题,可以正常使用。实际上,难点在于将指针插入到向量或映射中,而对于unique_ptr,必须移动指针进入容器。

谢谢!我不太确定,在谷歌上也找不到太多信息,所以很高兴得到了答案。 - OniLink
1
良好的解释加1分,尽管您可能需要注意一点:最多只能有一个unique_ptr指向资源,而无限数量的原始指针可以指向同一资源。 - templatetypedef
2
+1,也许添加一个插入示例(特别是显示为什么需要移动的示例)会有所帮助。 - Matthieu M.

4
  1. unique_ptr的区别在于它遵循移动语义。此外,顾名思义,您不能创建它的副本。

  2. std::vector<std::unique_ptr<T> >中删除元素将有效地删除该指针所指向的任何内容。


+1 for 2. - 当你专注于它时很明显,但在从原始指针转换为智能指针时可能会出现问题,如果你只使用原始指针指向已释放的内存,因为某个项目被删除。 - kfmfe04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,