`
ihuashao
  • 浏览: 4552460 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C++对象是怎么死的?为什么要写这个系列?

阅读更多

  要说C++对象是怎么死的,得先从C++的析构函数说起。这玩意儿是我本人很喜欢的一个语言特性(可惜有好几个语言没有类似的玩意儿,具体就不点名 了,免得引发口水战)。我们可以利用C++的构造和析构函数,来实现Guard模式,写出比较清晰、简练和异常安全的代码。由于Guard模式在C++程序中运用挺多,所以保证所有对象被析构 就是一个很重要很严肃的问题。 <!-- program-think-->
  另外,我发现很多C++程序员只关心内存泄露问题,不关心(或不清楚)资源泄露问题(很类似于我在“Java新手通病[3] ”提到的现象)。比如昨天的“C++对象是怎么死的?进程篇 ” 发布后,就有同学问了:进程死都死了,对象没销毁又有什么关系捏?其实大有关系啊!虽然操作系统会在进程死后帮它收尸(也就是把某些资源,比如内存进行回 收),基本不用担心内存泄露的问题。但是别忘了,除了内存资源,进程中可能还包含有其它业务层面的资源,而这些资源,操作系统是不会帮你自动回收的。所以 我要再啰嗦一次:资源泄露往往比内存泄露要严重得多啊 。啰嗦完之后,为了加深印象,再举如下一个例子。
  比如某业务逻辑Foo需要操作大量的临时文件(放在某动态生成的临时目录中),为了保证该业务逻辑结束后(可能是正常结束,也可能中途抛出异常),该临时目录总是被删除,可以使用如下的Guard模式。

class CTempDirGuard
{
public:
CTempDirGuard(const string& sFolderName)
{
// 创建某临时目录
}
virtual ~CTempDirGuard()
{
// 把该临时目录整个儿删除
}
};

void Foo()
{
CTempDirGuard guard(xxx); // 声明guard对象
// 往临时目录放东西
// 不管是出现return语句还是有异常抛出,guard都会被析构,因而该xxx目录会被删除

// 但是如果程序执行到此处,却发生进程的 自然死亡,
// 在这种情况下,该guard对象将不会 被析构,因此会留下一个垃圾目录,浪费了硬盘资源
}

  鉴于上述所说的两个原因,所以我一直想写一个这方面的帖子。正好前几天写了帖子讨论“架构设计的多进程问题 ”,之后就就顺便写了一个帖子:“C++进程是怎么死的?”,讨论了一下由于进程不同的死法对C++对象析构的影响。等写完之后突然想到:除了进程终止的问题可能导致C++对象的 正常析构,还有线程等其它因素也可能会让C++对象 正常析构。所以干脆就改了个名,叫“C++ 对象是怎么死的?” :-)

  另外,为了方便阅读,把本系列帖子的目录整理如下:
  1、进程篇
  2、对标准输入输出流的进一步探讨
  3、Win32线程篇
  4、POSIX线程(pthread)篇
  5、......


版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想 和本文原始地址:

http://program-think.blogspot.com/2009/02/cxx-object-destroy-overview.html

分享到:
评论

相关推荐

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之十二(类与对象:面向对象设计的基本思 想和特点) 鸡啄米:C++编程入门系列之十三(类与对象:类的声明、成员的访问 控制和对象) 鸡啄米:C++编程入门系列之十四(类与对象:构造...

    从汇编看C++系列前4篇

    因此,从今天起,我会写一个专题系列 《从汇编看 C++》 发布到我的博客里,欢迎收看 目前,我总共写了4篇,他们是: 1.《从汇编看C++ 之函数开销》 2.《从汇编看C++ 之类成员》 3.《从汇编看C++ 之引用指针动态内存...

    深度探索C++对象模型

    C++就先从这本《深度探索C++对象模型》开始。不同于《Effective C++》,这本书主要着眼于C++实现的底层机制,因此我在写这个系列时默认读者已经熟悉C++的基本语法(包括类、继承、多态、泛型等等),将更多地介绍C++...

    北大青鸟培训系列-面向对象编程:C++

    北大青鸟培训系列-面向对象编程:C++,内部培训课件,值得一看

    21世纪计算机应用技术系列规划教材 程序设计基础:C++

    本书系统地讲述C++语言的基础知识、基本语法以及编程方法,并且结合C++阐述面向对象的程序设计思想,使读者在掌握C++语言语法知识的同时,能够解决现实生活中较简单的问题,并用计算机语言进行描述。本书每一章中都...

    inside the c++ model 深度探索C++对象模型.part1.rar(中文版)

    深入c++系列,牛书,分两部分上传

    Essential C++带源码

    全书从4个方面来展现C++的本质:procedLJral(过程化的)、gerleric(泛型的)、object—based(基于对象的)、object—oriented(面向对象的)。本书的组织围绕着一系列由浅入深的程序设计问题,介绍了用以解决这些问题的...

    C++ View1~7

    这是一个在国内C++世界中有板有眼的免费系列电子套餐(PDF格式),目前已经发布7期。餐如其名,其以标准C++、面向对象程序设计(OOP)、泛型程序设计(GP)、设计模式(Design Patterns)为正餐,辅以C++开发环境等...

    C/C++笔试题(附答案,华为面试题系列)

    在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的...

    C++如何动态的生成对象详解

    再谈一谈动态生成对象,为什么强大的C++不支持呢?想用这样功能的人都必须自己实现一套这样的逻辑。 实现理由 有时候开发真是有些矛盾,例如:1、实现一个功能可以使用大量相似的代码、也可以使用模板,那我们怎么...

    信息技术c++.docx

    信息技术c++ 信息技术c++全文共30页,当前为第1页。信息技术c++全文共30页,当前为第1页。第1课时 程序设计概论 信息技术c++全文共30页,当前为第1页。 信息技术c++全文共30页,当前为第1页。 1、程序设计 【例1】 ...

    C++复习资料之系列

    用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 3.C++程序基本单位是( c )。 (a) 数据 (b) 字符 (c) 函数 (d) 语句 4. C++程序中的语句必须以( b )结束。 ...

    C++精华资料全集——云盘链接

    ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。 STLport:是STL具有代表性的版本。 STXXL:用于额外的大型数据集的标准模板库。 Ultimate++ :C++跨...

    Essential C++英文版

    本书以4个面向来表现C++的本质:procedural(程序性的)、generic(泛型的)、object-based(个别对象的)、object-oriented(面向对象的)。本书的组织围绕着一系列逐渐繁复的程序问题,以及用以解决这些问题的语言...

    大规模C++程序设计

    本书将高层设计概念与特定的C++编程细节结合起来,满足下面两个要求: 1、一本面向对象设计的书,尤其侧重于C++编程语言实现方面。 2、一本c++程序设计的书,描述如何使用C++编程语言来开发非常大型的系统。

    推荐的C++书籍 4.4 STL源码剖析

    &lt;&lt;insied the c++ object model&gt;&gt;看过后如一缕清风扫去一直以来你对语言的疑惑,你终于能明白compiler到底都背着你做了些什么了,这本书要细细回味,比较难啃,最好反复看几遍,加深印象 看完上一本之后,这本...

    Accelerated C++源代码

    此外,我们要感谢C++标准委员会的所有成员,他们多年来为C++澄清概念、细化标准和改进功能付出了艰苦的努力。我们要衷心地感谢本书的审稿人,他们审阅了我们的多份书稿,帮助我们对本书进行了无数大大小小的修改。...

    Turbo C/C++3.0

     “Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法...

    自己整理的超全的C++面试题集合

    本资源是一份C++面试题的资源,包含了一系列用于考察C++编程知识和能力的问题。这些问题涵盖了C++语言的各个方面,如基础语法、面向对象编程、模板、异常处理等。 适用人群: 本资源适用于准备参加C++相关职位面试...

Global site tag (gtag.js) - Google Analytics