auto_ptr

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>