auto_ptr是一个模板类,用于管理动态内存分配。

请看下面的函数:

void remodel (string& str)
{
  string * ps = new string(str);
  ...
  str = *ps;
  return;
}

上述代码存在这样一个缺陷:没有收回函数中分配的内存。

解决方法:在return前加上delete,如下所示:

void remodel (string& str)
{
  string * ps = new string(str);
  ...
  str = *ps;
delete ps;
  return;
}

上述解决方法并不是最佳的,因为编程者有时可能忘了,有时可能在不经意间删除或注释掉了这些代码。而且即使没有这些问题,也可能有其他问题。如:

void remodel (string& str)
{
  string * ps = new string(str);
  ...
if (weird_thing())
throw exception();
str = *ps;
  delete ps;
  return;
}

在上述代码中,当出现异常时,delete将不被执行,因此将导致内存泄露。

解决方法:如果一个指针对象,那么可以在对象过期时,让它的析构函数删除被指向的内存。这就是auto_ptr背后的思想。

auto_ptr的头文件为<memory>

使用方法:

auto_ptr<double>pd(new double);
auto_ptr<string>ps(new string);

上述函数经修改后如下所示:

void remodel (string& str)
{
  auto_ptr<string>ps (new string(str));
  ...
if (weird_thing())
throw exception();
str = *ps;
  return;
}

注意:auto_ptr的构造函数是显式的,这意味着不存在从指针到auto_ptr对象的隐式类型转换:

auto_ptr<double>pd;
double *p_reg = new double;
pd = p_reg; //not allowed
p_reg = pd; //not allowed
pd = auto_ptr<double>(p_reg);//allowed
auto_ptr<double>pauto(p_reg);//allowed

注意事项:

  • 只能对new分配的内存使用auto_ptr对象,而不要对由new[]分配的或通过声明变量分配的内存使用它。
  • 由于auto_ptr被销毁时会自动删除它所指之物,所以不能让多个auto_ptr同时指向同一对象,以避免对象被删除一次以上。为了预防这个问题,auto_ptr有一个不寻常的性质:若通过copy构造函数或copy assignment操作符赋值它们,它们会变成null,而复制得到的指针将取得资源的唯一所有权。

PS:

由于auto_ptr的复制行为的特殊性,因此引入了“引用计数型智慧指针”(reference-counting smart pointer;RCSP)。RCSP也是个智能指针,可以持续追踪共有多少对象指向某个资源,并在无人指向它时自动删除该资源。但是它无法打破环状引用(例如两个其实已经没被使用的对象彼此互值,因而好像还在“被使用”状态)。

TR1的tr1::shared_ptr就是个RCSP

auto_ptr类的更多相关文章

  1. 用auto_ptr类模板帮助动态内存管理

    动态内存使用最多的是在C++应用程序的代码中.有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出.当异常被掷出时,程序的正常控制流程被改变,因此导致 ...

  2. C++ 智能指针auto_ptr

    template<class T> class auto_ptr { public: ); // Item M5 有“explicitfor”// 的描述 template<clas ...

  3. auto_ptr 要点解析

    今天看了auto_ptr类的用法,又仔细看了看C++标准库中的符合标准的auto_ptr类别的实作,觉得自己基本上理解了auto_ptr的原理,下面就我的心得写几句,有不正确的地方,希望多多指教. 1 ...

  4. 以对象管理资源——C++智能指针auto_ptr简介

    auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...

  5. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  6. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  7. 代理设计模式在auto_ptr及smart_ptr中的体现

    下面这段代码是auto_ptr的实现: class Image { public: Image(string name): m_imageName(name) {} virtual ~Image() ...

  8. C++ Primer 与“类”有关的注意事项总结

    C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...

  9. 关于std:auto_ptr std:shared_ptr std:unique_ptr

    很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确 ...

随机推荐

  1. spring boot 2.0添加对fastjson的支持

    首先引入fastjson的maven依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId&g ...

  2. 小计---pandas读取带有中文文件名或者包含中文内容的文件

    python2下: # -*- coding: utf-8 -*- import pandas as pd mydata = pd.read_csv(u"例子.csv") #前面加 ...

  3. python2.7升级到python3.6注意事项

    python3.6下载地址:https://www.python.org/downloads/source/ 1.安装依赖包:gcc   openssl-devel.zlib-devel.readli ...

  4. [转]c#中从string数组转换到int数组

    string[] input = { "1", "2", "3", "4", "5", " ...

  5. Loadrunder之脚本篇——参数化同行取值

    select next row 记录选择方式 Same line as,这个选项只有当参数多余一个时才会出现,其作用是根据某一个参数的行号取同一行. 例中的做法如下: 将多个参数存放在一个参数文件中: ...

  6. Android BlueDroid(蓝牙协议栈)

    Android BlueDroid(一):BlueDroid概述 Android BlueDroid(二):BlueDroid蓝牙开启过程init Android BlueDroid(三):BlueD ...

  7. 一个由自增运算符以及C语法顺序细节引起的bug

     一.问题描述 在编写modbus代码时发生一件由语法细节引起的bug,起因是自增运算符以及C语法顺序. 输入的数据是2233=0X08B9,高低字节顺序是0x08 0xB9, 使用modbus po ...

  8. Python编程-模块和包

    一.模块 1.什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函 ...

  9. canvas 视频音乐播放器

    canvas 视频音乐播放器 var play_nor_img_path = 'images/play_btn_n.png'; //播放按钮 正常时 60x60 px var play_sec_img ...

  10. leetcode刷题3.无重复字符的最长子串

    题目:给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...