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. Ubuntu 14.04上安装WineTMQQ2013麒麟版

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/tao_627/article/details/24187699 我先后试用了longterm团队的2 ...

  2. 001-unity3d简介以及界面说明

    一.简介 学习路线1.C#.网络[http,socket]io2.GUI.NGUI.2DToolKit3.3D控制.物理引擎.角色控制4.粒子系统.音频等5.android.IOS开发基础6.sock ...

  3. 《Python机器学习》笔记(五)

    通过降维压缩数据 在前面已经介绍了几种不同的特征选择技术对数据集进行降维的方法.另一种常用于降维的特征选择方法就是特征抽取.数据压缩也是机器学习领域中的一个重要内容.数据压缩技术可以帮助我们对数据及逆 ...

  4. 用数据池来实现socket并发

    最终目标:启动服务后可以有无数个访问,并且可以随时输入,服务端使用进程池. 服务端 from socket import * import os,time from concurrent.future ...

  5. pyhton3 random模块

    random是内建(built-in)函数,作用是产生随机数 导入模块: import random 接着就可以调用random模块下的函数了使用 dir(random)可以查看random模块下有哪 ...

  6. 前端 初级篇(HTML)

    HTML 概述: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就 ...

  7. $python正则表达式系列(2)——re模块常用函数

    本文主要介绍正则re模块的常用函数. 1. 编译正则 import re p = re.compile(r'ab*') print '[Output]' print type(p) print p p ...

  8. P4121 [WC2005]双面棋盘

    题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...

  9. vue引入bootstrap.min.css报错:Cannot find module "./assets/css/bootstrap.min.css"

    问题如下图: 明明文件就在那里,就是报错说找不到模板,然后我就用了网上的方法,重新建立了一个项目,请参考如下: http://blog.csdn.net/ansu2009/article/detail ...

  10. python的常用的内置函数

    使用内置函数的好处:简单,快速. 1.zip():以多个序列为参数,返回元祖列表. 长度:在多个序列长度不一时,以最短的为准. 常见用途:构建多参数列表,构建字典. 2.map():在python2旧 ...