auto_ptr

来源:互联网 发布:《算法统宗》的题目 编辑:程序博客网 时间:2024/06/08 13:27

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 表达式创建的对象的地址且该对象的初始化值为 1024auto_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;}


0 0
原创粉丝点击