C++对象是怎么死的?为什么要写这个系列?
2011-05-10 13:18
274 查看
要说C++对象是怎么死的,得先从C++的析构函数说起。这玩意儿是我本人很喜欢的一个语言特性(可惜有好几个语言没有类似的玩意儿,具体就不点名 了,免得引发口水战)。我们可以利用C++的构造和析构函数,来实现Guard模式,写出比较清晰、简练和异常安全的代码。由于Guard模式在C++程序中运用挺多,所以保证所有对象被析构 就是一个很重要很严肃的问题。
另外,我发现很多C++程序员只关心内存泄露问题,不关心(或不清楚)资源泄露问题(很类似于我在“Java新手通病[3] ”提到的现象)。比如昨天的“C++对象是怎么死的?进程篇 ” 发布后,就有同学问了:进程死都死了,对象没销毁又有什么关系捏?其实大有关系啊!虽然操作系统会在进程死后帮它收尸(也就是把某些资源,比如内存进行回 收),基本不用担心内存泄露的问题。但是别忘了,除了内存资源,进程中可能还包含有其它业务层面的资源,而这些资源,操作系统是不会帮你自动回收的。所以 我要再啰嗦一次:资源泄露往往比内存泄露要严重得多啊 。啰嗦完之后,为了加深印象,再举如下一个例子。
比如某业务逻辑Foo需要操作大量的临时文件(放在某动态生成的临时目录中),为了保证该业务逻辑结束后(可能是正常结束,也可能中途抛出异常),该临时目录总是被删除,可以使用如下的Guard模式。
鉴于上述所说的两个原因,所以我一直想写一个这方面的帖子。正好前几天写了帖子讨论“架构设计的多进程问题 ”,之后就就顺便写了一个帖子:“C++进程是怎么死的?”,讨论了一下由于进程不同的死法对C++对象析构的影响。等写完之后突然想到:除了进程终止的问题可能导致C++对象的不 正常析构,还有线程等其它因素也可能会让C++对象不 正常析构。所以干脆就改了个名,叫“C++ 对象是怎么死的?” :-)
另外,为了方便阅读,把本系列帖子的目录整理如下:
1、进程篇
2、对标准输入输出流的进一步探讨
3、Win32线程篇
4、POSIX线程(pthread)篇
5、......
另外,我发现很多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、......
相关文章推荐
- 模块解耦实践1——为什么写这个系列的文章
- 我怎么做这个项目?——对《为什么我们程序员总是这么累、做出来的东西这么差? 》一文的回复
- TCP快速重传为什么是三次冗余ack,这个三次是怎么定下来的?
- 【SEO系列学习专题】——000 序:为什么要学SEO,怎么学?
- 序:为什么要写这个系列
- 为什么会出现这个问题怎么解决?
- [文摘20160524]为什么你的孩子不像德国孩子那样自律?看过这个就知道怎么做了!
- TCP快速重传为什么是三次冗余ack,这个三次是怎么定下来的?
- [jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?
- 我怎么做这个项目?——对《为什么我们程序员总是这么累、做出来的东西这么差? 》一文的回复
- Lucene/ElasticSearch 学习系列 (1) 为什么学,学什么,怎么学
- 我为什么要写《一起学java》这个系列
- 无废话网页重构系列——(1)为什么要写这个系列
- 小白求大神门指点一下我在运行vs2017时出现这个提示是为什么呀,怎么解决这个问题呢?
- 为什么游戏完成度不高?怎么解决这个问题?
- 代码make后出现的错误----为什么会出现这个错误,怎么改?
- 要有个责任,奥巴马所说的:“必须多谈及责任这个词了”,不论你完成没有,你时刻都得有这个词,就算没完成,搞清楚是为什么没完成?要怎么办?有些人总喜欢子在这个时候下决心说下次一定努力又意思吗?
- 为什么要写这个系列文章【程序员成长之道系列文章之1】
- hdu4510小Q系列故事——为什么时光不能倒流
- 三方app调用微信分享的时候,唤起微信很慢,我想在这过程中加个等待对话框,这个要怎么判断app正在唤起微信