auto_ptr是一种智能指针(smart pointer),用来自动分配对象并且当不再需要对象时进行自动销毁。
智能指针可以保证,无论在什么情况下,只要自己被摧毁,就一定连带释放其所指资源。并且由于智能指针本身就是区域变量,无论正常退出与否,只要函数结束,它一定就会被销毁。auto_ptr是这样一种指针,它是“它所指向的对象”的拥有者,所以auto_ptr被销毁时,该对象也遭到销毁。
#include <memory>//auto_ptr类模板
#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char const *argv[])
{
//pi 被初始化为由 new 表达式创建的对象的地址且该对象的初始化值为 1024
auto_ptr< int > pi (new int( 1024 ));
if ( *pi != 1024)
{
/* code */
cerr << "opps error" <<endl;
} else
*pi = 2;
cout<<*pi<<endl;
auto_ptr< string > pstr_auto( new string("hello auto_ptr"));
if ( pstr_auto->empty())
{
cerr << "opps error" <<endl;
}
cout<<*pstr_auto<<endl;
/*auto_ptr类模板背后的主要动机是支持与普通指针类型相同的语法
但是为auto_ptr所指对象的释放提供了自动管理
当定义一个auto_ptr对象时,它知道自己对初始化拥有权并且有责任删除*/
auto_ptr< int > p1 ( new int( 1024 ));
auto_ptr< int > p2 ( new int( 2048 ));
cout<<"p1:"<<*p1<<" p2:"<<*p2<<endl;
p1 = p2;
// cout<<"p1:"<<*p1<<" p2:"<<*p2<<endl;//出错
/*在赋值之前由p1指向的对象被删除,赋值之后p1拥有int型对象的所有权,该对象值为2048,p2不再被用来指向该对象*/
//另一种定义形式创建了一个auto_ptr对象,但是没有使用指针将其初始化
auto_ptr< int > p_auto_int;
//cout << *p_auto_int<<endl;//没有初始化内部指针被设置为0,出错还没有初始化
if ( p_auto_int.get() != 0 && *p_auto_int != 1024)
{
*p_auto_int = 1024;
} else {
p_auto_int.reset( new int( 1024 ));
}
cout << *p_auto_int<<endl;
//我们不能在auto_ptr对象被定义之后再用new 表达式创建对象的地址直接像其赋值,因此我们不能这样写
//auto_ptr<int> p3;
//p3 = new int(4);
//reset函数
const time_t rtb = time(NULL);
auto_ptr< string > ps1 (new string("qweiroeriklkjsdald,mcxddsd"));
ps1.reset( new string("djksldfsddddk"));
const time_t rte = time(NULL);
cout<<rte-rtb<<endl;
//如果auto_ptr当前指向一个对象并且该auto_ptr对象拥有该对象的所有权
//则该对象在底层指针被重置之前首先被删除
//assign()函数对原有的字符串对象重新赋值,比删除原有的字符并重新分配更有效率
auto_ptr< string > ps2 (new string("qweiroeriklkjsdald,mcxddsd"));
ps2->assign( "djksldfsddddk");
system("pause");
return 0;
}