如何使用C++智能指针?

Ami*_*hum 11 c++ smart-pointers

我已经使用C++一段时间了,我仍然觉得使用智能指针感觉不太舒服,我只是在编辑一些使用它们的代码时一直使用它们,从不在我自己的代码中(可能值得说我是学生).

你能解释什么是智能指针的类型,它们如何工作以及何时使用它们?

另外,在其他人编写的接口中接收或传递原始指针时,"协议"是什么?

谢谢.

dir*_*tly 16

C++ 98不提供任何智能指针,除了auto_ptr它充满了自己的问题.C++ 0X试图通过使在几个多品种(解决这个问题shared_ptr,unique_ptr等等).与此同时,最好的选择是使用Boost.看看这里提供的各种口味.Boost是社区驱动的,经过广泛测试,当然也是免费的.有很好的文档和示例代码可以帮助您入门.

你能解释什么是智能指针的类型,它们如何工作以及何时使用它们?

有很多.简而言之:

scoped_ptr <boost/scoped_ptr.hpp> 单个对象的简单唯一所有权.不可复制.

scoped_array <boost/scoped_array.hpp> 简单的数组唯一所有权.不可复制.

shared_ptr <boost/shared_ptr.hpp> 对象所有权在多个指针之间共享.

shared_array <boost/shared_array.hpp> 多个指针之间共享的数组所有权.

weak_ptr <boost/weak_ptr.hpp> shared_ptr拥有的对象的非拥有观察者.

intrusive_ptr <boost/intrusive_ptr.hpp> 具有嵌入引用计数的对象的共享所有权.

(这是来自Boost文档并注意到它们也有这样的指针容器!)

另外,在其他人编写的接口中接收或传递原始指针时,"协议"是什么?

对我来说,最重要的规则是:

  • 常量资格
  • 不要释放我没有分配的东西
  • 检查所有权/移动语义的转移

  • 很好的总结.我不同意auto_ptr充满了问题.如果你不明白它做了什么,那么它会让你感到惊讶,但这可以通过阅读文档来解决.此外,新的C++ 0x提供了std :: unique_ptr,这实际上是对auto_ptr的替代,但使移动语义对新手来说更加明显.看到哪些已被包含在新标准库中也是很好的. (2认同)