C++中的智能指针(auto_ptr)

发表于:2016-2-19 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:mengfanrong    来源:51Testing软件测试网采编

  实际上auto_ptr 仅仅是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势。使用它不必每次都手动调用delete去释放内存。当然有利也有弊,也不是全然完美的。
  本文从以下的8个方面来总结auto_ptr使用的大部分内容。
  1. auto_ptr是什么?
  auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个这样拥有者(auto_ptr)。
  当auto_ptr对象生命周期结束时。其析构函数会将auto_ptr对象拥有的动态内存自己主动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。
  2. auto_ptr须要包括的头文件?
  #include <memory>
  3. 初始化auto_ptr对象的方法?
  1) 构造函数
  1] 将已存在的指向动态内存的普通指针作为參数来构造
  int* p = new int(33);
  auto_ptr<int> api(p);
  这样在api对象的生命周期结束的时候。会调用自身的析构函数,并delete来释放拥有的内存,这样我们就不须要写以下的代码:
  delete p;
  2] 直接构造智能指针
  auto_ptr< int > api( new int( 33 ) );
  2) 拷贝构造
  利用已经存在的智能指针来构造新的智能指针
  auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );
  auto_ptr< string > pstr_auto2(pstr_auto );  //利用pstr_auto来构造pstr_auto2
  由于auto_ptr智能指针仅仅能独享一块动态内存,所以在拷贝构造或赋值时都会发生拥有权的转移。
  在此拷贝构造过程中,pstr_auto将失去对字符串内存的全部权,而pstr_auto2将其获得。
  pstr_auto2负责内存的自己主动销毁。
  3) 赋值
  利用已经存在的智能指针来构造新的智能指针
  auto_ptr< int > p1( new int( 1024 ));
  auto_ptr< int > p2( new int( 2048 ));
  p1 = p2;
  在赋值之前。由p1 指向的对象被删除。赋值之后。p1 拥有int 型对象的全部权。该对象值为2048。 p2 不再被用来指向该对象。
  4. 空的auto_ptr 须要初始化吗?
  通常的指针在定义的时候若不指向不论什么对象,我们用Null给其赋值。
  对于智能指针,由于构造函数有默认值0,我们能够直接定义空的auto_ptr例如以下:
  auto_ptr< int >p_auto_int;  //不指向不论什么对象
  5. 防止两个auto_ptr对象拥有同一个对象(一块内存)
  由于auto_ptr的全部权独有。不能共享动态分配的内存。所以以下的代码会造成混乱。
  int* p = new int(0);
  auto_ptr<int> ap1(p);
  auto_ptr<int> ap2(p);
  由于ap1与ap2都觉得指针p是归它管的,在析构时都试图删除p, 两次删除同一个对象的行为在C++标准中是没有定义的。所以我们必须防止这样使用auto_ptr。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号