auto_ptr的设计动机

C++标准程序库提供的auto_ptr是一种智能型指针(smart pointer),帮助程序员防止“被异常抛出时发生资源泄露”。

函数的操作经常依以下模式进行:

1.获取一些资源

2.执行一些操作

3.释放所获取的资源

如果一开始所获取的资源被绑定于局部对象(local objects)身上,当函数退出时,他们的析构函数(destructor)被调用,从而自动释放这些资源。然而事情不总是这么顺利,如果资源是以显示手法获得,而且没有绑定在任何对象身上,那就必须以显示的手法释放。这种情形通常发生在指针身上。

一个典型的例子就是运用new 和 delete 来产生和销毁对象:

void f()
{
ClassA *ptr=new ClassA; //create an object explicitly
... //perform some operations
delete ptr; //clean up(destory the object explicitly)
}

也许你尚未意识到,这个函数其实是一系列麻烦的根源。一个显而易见的问题是,当我们忘记delete时,特别是函数中间存在return语句时,然而真正的麻烦常常发生在更隐晦的地方,那就是当异常发生时我们所要面临的灾难。函数闪退,delete不会被调用。导致内存遗失,或更一般滴说资源遗失。
    防止这种情况的一种解决方法是扑捉所有异常,例如:

void f()
{
ClassA* ptr=new ClassA; //create an object explicitly
try{
... //perform some operations
}
catch(..){ //for any exception
delete ptr; //- clean up
throw; //rethrow the exception
}
delete ptr; //clean up on normal end
}

你看,这种方法是何等麻烦,此外还可能需要更多的catch语句。这并不是优良的编程风格,复杂容易出错,必须尽量避免。
      如果使用智能指针,情况大不相同。这个智能指针应当保证,无论在何种情形下,只要自己被摧毁,就一定连带释放其所指的资源。而由于智能型指针本来就是区域变量。所以无论是正常退出,还是异常退出,只要函数退出,它就一定会被销毁。auto_ptr就是这种智能型指针。

auto_ptr是这种一种智能型指针:它是“它所指向的对象”的拥有者(owner)。所以,当身为对象拥有者的auto_ptr被摧毁时,该对象也将遭到摧毁。auto_ptr要求一个对象只能有一个拥有者,严禁一物二主。

      例如:

//header file for auto_ptr
#include <memory>
void f()
{
//create and initialize an auto_ptr
std::auto_ptr<ClassA> ptr(new ClassA);
... //perform some operations
}

不在需要delete,也不在需要catch了。auto_ptr的接口与一般指针相似:operator*用来提取所指对象,operator->用来指针对象的成员。然后所有指针算术(包括++)都没有定义(这可能是好事,因为指针算术是一个大麻烦)。
      注意:auto_ptr<>不允许你使用一般指针惯用的赋值(assign)初始化方式。你必须使用数值来完成初始化:

std::auto_ptr<ClassA> ptr1(new ClassA);   //Ok
std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR

author:panzg

time:2013.10.27

auto_ptr的设计动机的更多相关文章

  1. 二叉排序树、平衡二叉树、B树&B+树、红黑树的设计动机、缺陷与应用场景

    之前面试时曾被问到"如果实现操作系统的线程调度应该采用什么数据结构?",因为我看过ucore的源码,知道ucore是采用斜堆的方式实现的,可以做到O(n)的插入.O(1)的查找.我 ...

  2. gRPC设计动机和原则

    https://mp.weixin.qq.com/s/NMIIa0W722zo_AxCqASc0g TiDB 与 gRPC 的那点事儿 黄东旭 PingCAP 2017-08-10   gRPC 背景 ...

  3. C++ 智能指针auto_ptr详解

    1. auto_ptr 的设计动机: 函数操作经常依照下列模式进行: 获取一些资源 执行一些动作 释放所获取的资源 那么面对这些资源的释放问题就会出现下面的两种情况: 一开始获得的资源被绑定于局部对象 ...

  4. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  5. Hadoop2.0(HDFS2)以及YARN设计的亮点

    YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResouceManager负责对各个Node ...

  6. 必胜宅急送Web app设计背后的思考

    O2O模式是餐饮业在移动消费趋势下主动拥抱互联网的方向,迎合餐饮消费者从以往经验判断为主转变为依靠移动设备.lbs.社交网络进行立体决策的过程.继App客户端之后,手机web app也逐渐成为O2O中 ...

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

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

  8. java设计模式图

    一.什么是设计模式                                                                                           ...

  9. hadoop生态圈介绍

    原文地址:大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍   1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分 ...

随机推荐

  1. jQuery checkBox 全选的例子

    表单处理时经常会有全选的功能,但是这个功能往往会被忽视一个细节,就是逐个选中 checkBox 直至全选时,经常会忘记修改全选 checkBox 的状态,某知名互联网公司的网盘就会出现这样的问题,问题 ...

  2. 大数求模 sicily 1020

        Search

  3. 模板:abs用法

    c语言书本上说,数学函数除了求整数的绝对值函数abs()之外<abs() 定义在stdlib.h中>,其余的函数都在头文件 math.h 中定义,包括对浮点数求绝对值的函数fabs().c ...

  4. PHP 正则表达式替换一部分内容

    preg_replace('/&topic=(.*?)&type=/',"&topic={$data['topic']}&type=",$postF ...

  5. 四位数码管SH5461AS的问题,arduino学习实测.

    arduino入门教程到第16课遇到些问题.效果一直是混乱的状态. 琢磨了半天发现一些问题,和大家分享下 1)接线图,原图没有问题,只是比较含糊,线比较多不好看. 我用红色数字标示数码管的12个脚,并 ...

  6. 常用sql时间字符转化

    这边主要用到2个函数  convert()  cast() cast是对数据字符类型的转化,例如: cast(date as datetime)   这样就将date字段转化成为时间类型了 因为常用到 ...

  7. Silverlight自动根据屏幕分辨率进行布局

    xaml: <UserControl x:Class="SLCenterLayout.MainPage" xmlns="http://schemas.microso ...

  8. Elastix 禁用SSL(https),还原为 http 访问

    1.相关配置文件目录: Apache的配置文件:httpd.conf,位于:/etc/httpd/conf/httpd.conf,配置文件中包含 Include conf.d/*.conf ,引入了  ...

  9. ActiveMQ.xml文件的主要配置

    ActiveMQ.xml文件默认位置位于 activemq/conf/目录下,主要的配置及解析如下:<beans xmlns="http://www.springframework.o ...

  10. (转)《深入理解java虚拟机》学习笔记10——并发编程(二)

    Java的并发编程是依赖虚拟机内存模型的三个特性实现的: (1).原子性(Atomicity): 原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的. ...