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

时间:2010-08-14 16:11:29

标签: c++ smart-pointers

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

您能解释一下智能指针的类型,它们如何工作以及何时使用它们?

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

感谢。

5 个答案:

答案 0 :(得分:16)

C ++ 98不提供除auto_ptr之外的任何智能指针,它充满了自己的问题。 C ++ 0X试图通过引入更多变种(shared_ptrunique_ptr等来解决这个问题。与此同时,最好的选择是使用Boost。看看你可以使用的各种口味here。 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文档并注意到它们也有这样的指针容器!)

  

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

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

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

答案 1 :(得分:1)

智能指针类型是一个抽象层,用于自动分配和释放内存的过程,它们的构造函数,获取分配的内存(通过指针)及其析构函数,释放分配的内存。当然构造函数和析构函数可以内联(因此没有调用它们的开销)。例如:

{
    int* raw = new int(40);
    auto_ptr<int> sp(raw); //inline constructor: internal_holder = raw
    //...
    //inline destructor: delete internal_holder
}

在C ++中,间接使用指针很好(将它们隐藏在类后面)。创建新智能指针的开销可以忽略不计。但是shared_ptr由于其计数引用的行为(它被引用计数)而更加重要。

当我们想要使用从其他人编写的其他函数接收的原始指针时,如果这些原始指针不应该由我们自己释放,那么我们就不应该使用智能指针。

答案 2 :(得分:0)

关于STL auto_ptr,我建议阅读Herb Sutter(优秀C ++书籍的作者)GuruOfTheWeek:使用此Link

答案 3 :(得分:0)

没有关于何时使用智能指针的规则。更合适的是,尽可能使用智能指针。原始指针在编写良好的C ++代码中很少见。当你收到一个原始指针时,将它包装在一个自动释放的自定义编写的智能指针中,如果你有责任解除分配它。

答案 4 :(得分:0)

完成即将推出的C ++ 0x标准的答案和可用答案。这些链接提供了有关何时以及如何使用它们的示例。它还记录了shared_ptr和weak_ptr之间的关系。

http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr

http://www2.research.att.com/~bs/C++0xFAQ.html#std-weak_ptr

http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr