这个题目比较大,估计我也写不全了,想到哪就算到哪。
为什么要想写这个呢?新出来的语言,Java/.NET的各种语言/Python/Lua等等,几乎都有自动内存管理。可是C++这么老,而且很底层的语言,对动态内存管理的支持就不好。写C++程序的时候,需要更加小心,才不会出错。
看下面的例子:
File
*
file
=
SystemFactory::createFile(fileName);
//
谁也不知道,这里会不会返回NULL指针
InitData(file);
//C++没有好办法让你知道,这里会不会抛出异常
delete file; //很好,你记得要delete掉他
//但不幸的是,这不能保证程序能正确的管理内存
就算是这么简单的一段程序,要想写对都不那么容易。可以想象,实际工作中,一定需要一个学习的过程才能掌握内存管理的技巧。
上面这段代码,问题就出在没有处理异常。异常是一种隐式的跳转,经常不被注意到。但实际上,明显的改变执行路径的语句,也会被忽略。比如,你在上面的create和delete中间,加了一句测试:
if
(XYZW)
return
;
某种情况下,直接返回。问题就出来了,后面的delete没有被执行到。
一般来说,这么简单的地方,大家都能看得到,会在return之前加上delete。但是:
为什么要想写这个呢?新出来的语言,Java/.NET的各种语言/Python/Lua等等,几乎都有自动内存管理。可是C++这么老,而且很底层的语言,对动态内存管理的支持就不好。写C++程序的时候,需要更加小心,才不会出错。
看下面的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
delete file; //很好,你记得要delete掉他
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
上面这段代码,问题就出在没有处理异常。异常是一种隐式的跳转,经常不被注意到。但实际上,明显的改变执行路径的语句,也会被忽略。比如,你在上面的create和delete中间,加了一句测试:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
一般来说,这么简单的地方,大家都能看得到,会在return之前加上delete。但是:
- 把同样的代码重复很多次,不是一个好的编码风格
- 如果中间的代码越加越多,你就越来越容易忘掉。也就是说,这样的代码难于维护。