我一直在使用C ++已经有一段时间了,我仍然觉得使用智能指针感觉不太舒服,我只是在编辑使用它们的代码时才使用它们,从不在我自己的代码中(可能值得一说,我是学生。)
您能解释一下智能指针的类型,它们如何工作以及何时使用它们?
此外,在其他人编写的接口中接收或传递原始指针时,“协议”是什么?
感谢。
答案 0 :(得分:16)
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文档并注意到它们也有这样的指针容器!)
此外,在其他人编写的接口中接收或传递原始指针时,“协议”是什么?
对我来说,最重要的规则是:
答案 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