2010-08-14 87 views
11

我一直在使用C++一段时间,我仍然不太愿意使用智能指针,而且我只在编辑使用它们的代码时才使用它们,从来没有在我自己的代码中使用它(它可能是值得说我是学生)。如何使用C++智能指针?

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

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

谢谢。

+1

在这个非常站点A小的搜索为您提供以下 http://stackoverflow.com/search?q=smart+pointers – celavek 2010-08-14 16:14:31

+0

许多不同的可能的重复对这个问题... – 2011-11-20 01:02:40

回答

15

C++ 98不提供除auto_ptr之外的任何智能指针,它们充满了它自己的问题。 C++ 0X试图通过引入更多的品种(shared_ptr,unique_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文档,并注意他们有这样的指针容器呢!)

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

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

  • 常量资格
  • 不解除分配的东西我不分配
  • 检查所有权转移/移动语义
+2

好总结。我不同意auto_ptr充满了问题。如果yuo不明白它的作用,那么它可能会让你感到意外,但通过阅读文档可以解决这个问题。另外,新的C++ 0x提供了std :: unique_ptr,它实际上是替代auto_ptr的下降,但是使得移动语义对新手来说更加明显。看到哪些已被包含到新的标准库中也是很好的。 – 2010-08-14 16:36:55

+0

授予。我有点苛刻,我们会继续使用'auto_ptr'(尽管我的草稿副本,即n3090表示它已被弃用)。 – dirkgently 2010-08-14 17:10:36

+0

调用助推文档“优秀”是有点拉伸:)。质量上升和下降,取决于有问题的库。但一般来说,好的答案是+1。 – Lucas 2010-08-14 18:24:39

0

关于STL auto_ptr,我推荐阅读Herb Sutter's(好C++书籍的作者)GuruOfTheWeek:使用这个Link

1

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

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

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

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

0

没有关于何时使用智能指针的规则。更合适的是,您尽可能使用智能指针。原始指针在写得很好的C++代码中是罕见的。当您收到一个原始指针时,如果您有责任释放它,则将其封装在一个自我释放的自定义写入智能指针中。