C++内存管理变革(3):另类内存管理
2010-10-15 09:07:46 来源:Web开发网最简单的C++/Java程序
最简单的Java程序:
class Program
{
public static void main()
{
new int;
}
}
对应的C++程序:
void main()
{
new int;
}
我想没有一个Java程序员会认为上面的Java代码存在问题。但是所有严谨的C++程序员则马上指出:上面这个C++程序有问题,它存在内存泄漏。但是我今天想和大家交流的一个观念是:这个C++程序没有什么问题。
DocX程序的内存管理
DocX是我开发的一个文档撰写工具。这里有关于它的一些介绍。在这一小节里,我要谈谈我在DocX中尝试的另类内存管理方法。
DocX的总体流程是:
读入一个C++源代码(或头)文件(.h/.c/.hpp/.cpp等),分析其中的注释,提取并生成xml文档。
通过xslt变换,将xml文档转换为htm。
分析源代码中的所有include指令,取得相应的头文件路径,如果某个头文件没有分析过,跳到1反复这些步骤。
最后所有生成的htm打包生成chm文件。
一开始,我象Java/C#程序员做的那样,我的代码中所有的new均不考虑delete。当然,它一直运作得很好,直到有一天我的文档累计到了一定程度后。正如我们预见的那样,DocX程序运行崩溃了。
那么,怎么办呢?找到所有需要delete的地方,补上delete?
这其实并不需要。在前面,我给大家介绍了AutoFreeAlloc(参见《C++内存管理变革(2):最袖珍的垃圾回收器》),也许有人在嘀咕,这样一个内存分配器到底有何作用。——那么,现在你马上可以看到它的典型用法之一了:
对于我们的DocX崩溃后,我只是做了以下改动:
加一个全局变量:std::AutoFreeAlloc alloc;
所有的new Type(arg1, arg2, …, argn),改为STD_NEW(alloc, Type)(arg1, arg2, …, argn);
所有的new Type[n],改为STD_NEW_ARRAY(alloc, Type, n);
每处理完一个源代码文件时,调用一次alloc.clear();
搞定,自此之后,DocX再也没有内存泄漏,也不再有遇到内存不足而崩溃的情形。
- ››管理/var/spool/clientmqueue/下的大文件
- ››管理私有云,第 2 部分: 使用 WebSphere CloudBur...
- ››内存屏障与JVM并发
- ››管理 Eclipse 环境:Eclipse 维护的神秘艺术
- ››管理私有云:WebSphere CloudBurst Appliance 命令...
- ››管理启动项 - Windows 7中的BCDEDIT命令
- ››管理Exchange 2003注意事项
- ››管理好超级管理员帐户堵住系统漏洞
- ››管理数据中心资源池需要注意的事项
- ››管理虚拟化环境的两大重要标准:VMAN和OVF
- ››内存调试技巧
- ››管理与技术有机结合 保障网络安全运行
更多精彩
赞助商链接