auto_ptr就是动态分配对象以及当对象不再需要时自动执行清理。
使用std::auto_ptr,要#include <memory>。
构造和析构
1. 将已存在的指向动态内存的普通指针作为参数来构造
int*p=new int(0);
auto_ptr<int> ap(p);
2. 直接构造智能指针
auto_ptr< int > api( new int( 0 ) );
因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,两个auto_ptr不能同时拥有同一个对象。
因为auto_ptr的析构函数中删除指针用的是delete,而不是delete [],所以我们不应该用auto_ptr来管理一个数组指针。
拷贝构造与赋值
因为一个auto_ptr被拷贝或被赋值后,其已经失去对原对象的所有权。
这种情况较为隐蔽的情形出现在将auto_ptr作为函数参数按值传递,因为在函数调用过程中在函数的作用域中会产生一个局部对象来接收传入的auto_ptr(拷贝构造),这样,传入的实参auto_ptr就失去了其对原对象的所有权,而该对象会在函数退出时被局部auto_ptr删除。所以警惕把智能指针作为函数参数。
引用或指针时,不会存在上面的拷贝过程。结论:const reference是智能指针作为参数传递的底线。
初始化
对于智能指针,因为构造函数有默认值0,我们可以直接定义空的auto_ptr如下:
auto_ptr< int > p_auto_int; //不指向任何对象
1) get()
返回auto_ptr指向的那个对象的内存地址。
2) reset()
重新设置auto_ptr指向的对象
3) release()
返回auto_ptr指向的那个对象的内存地址,并释放对这个对象的所有权。
用此函数初始化auto_ptr时可以避免两个auto_ptr对象拥有同一个对象的情况(与get函数相比)
另外shared_ptr 属于引用计数型智慧指针,能够持续跟踪有多少对象指向某笔资源,并在无人指向它时自动删除该资源。
与auto_ptr不同之处:两个shared_ptr能同时拥有同一个对象,即可以通过copy构造函数或copy assignment复制他们。
如 :std::auto_ptr 、std::tr1::shared_ptr