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. codeforces Round 286# problem A. Mr. Kitayuta's Gift

    Mr. Kitayuta has kindly given you a string s consisting of lowercase English letters. You are asked ...

  2. Use XSLT in wix

    Following content is directly reprinted from https://installpac.wordpress.com/2012/05/07/conflict-ma ...

  3. VBA访问SQLSERVER2005筛选数据库

    EXCEL版本2010, 引用 Private Sub CommandButton1_Click() Dim conn As New ADODB.Connection Dim rs As New AD ...

  4. C语言 猜数游戏--产生一个随机数

    #include <stdio.h> #include <time.h> #include <stdlib.h> int main(int argc, const ...

  5. c++11: less的用法

    less主要是重载了operator()方法,用来比较lhs 和 rhs std::less::operator() bool operator()(const T &lhs, const T ...

  6. Turn.js 实现翻书效果的学习与总结

    最近CTO给我分配了一个移动端H5开发的任务,主要功能是需要实现翻书效果,我听过主要需求后,当时是呀!!!接下来自己尝试使用fullPage.js和Swiper来实现翻书效果,结果效果都不是非常的理想 ...

  7. PHP中文URL编解码(urlencode()rawurlencode()

    PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码为 '+',而后者把空格编码为 '%20',不过应该注意的是,在编码时应该只 ...

  8. php多层数组与对象的转换实例代码

    通过json_decode(json_encode($object)可以将对象一次性转换为数组,但是object中遇到非utf-8编码的非ascii字符则会出现问题,比如gbk的中文,何况json_e ...

  9. Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

    1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...

  10. XHTML1.0对HTML4.0的改进

    1.XHTML借鉴了XML的写法,语法更加严格: 2.XHTML实现了把页面样式和内容分离了,废弃了HTML4.0中表示样式的标签和属性,推荐使用CSS样式来描述页面的样式. XHTML1.0 分为两 ...