有关内存泄漏的查找解决思路方法

From: http://bbs.csdn.net/topics/370089150

有关内存泄漏的查找解决思路方法 从网上看到的感觉不错 给大家分享


内存泄漏指的是软件在运行过程中对于申请的内存空间没有释放,导致内存占用越来越大,最后程序异常崩溃,而且此时也不会留下任何痕迹,没有任何系统日志可查。

内存泄漏也分为两种,一种是程序一起动,然后占用了内存,不会随着程序运行增长;

一种是随着程序运行不停增长的;如果是第一种可以放过,对二种一定要仔细检查,检查工具推荐用FastMM,并且把DELPHI的项目属性Compiler->Use Debug DCUs和Linker->Map file->Detailed选中,这样FastMM就可以把申请内存的调用堆栈和MAP地址打出来,非常利于查找内存泄漏。

查找内存泄漏一般可以从以下几个方面考虑:

1. 使用Dispose释放内存的时候要加上定义信息,如果不加定义信息,对于一些指针或者string释放不了,对于结构体内部有指针的应先释放内部指针;

2. 使用FreeMem或FreeMemory释放内存的时候,可以不加大小信息,这是因为DELPHI内存管理器内部知道指针大小信息;

3. Override函数一定要inherited来释放父类申请的内存;

4. 申请的内存要确保释放,可以用Try … finally … end来确保内存的释放,但是应杜绝这种代码风格try …申请内存…finally …释放内存… end;

5. 系统内核对象要确保关闭;

6. 申请的指针如果在某些情况下分配空间,要记得初始化为nil,释放的时候要判断是否为空,因为释放空指针也会导致内存泄漏;

7. 另外PostMessage也有可能导致内存泄漏,这种情况是通过PostMessage发送结构体,释放内存放在消息处理函数中,这时如果频繁的调用PostMessage,消息处理循环忙不过来,就会丢掉一些消息,造成内存泄漏,默认的Windows消息队列长度是4000,如果说消息队列有4000个,你这时再用PostMessage投递消息,就会被丢掉,造成申请的结构体无法释放,造成内存泄漏; 

上一篇:JavaScript多线程--Worker对象基础


下一篇:C#-用于自动化的User32 API自定义PostMessage