浅谈内存泄漏的原因
前几天项目的一部份已经交付给客户使用,反馈回的意见还算少,主要问题是不稳定,在不经意的检查中,发现是内存泄漏。内存泄漏对于Delphi来说是致命的,因为Delphi没有一样工具可以像样的检查内存泄漏(除了汇编窗口,有谁能用它来检查内存泄漏我会相当的佩服)。
在网上http://www.cnblogs.com/abchjb/articles/18685.html发现了检查内存泄漏的代码,使我在两天时间内修复了很多的BUG,在此感谢一下。内存泄漏测试及修复的技巧在前面的URL里都已经提到,下面把我觉得关键的地方列出来。
下面的这些技巧对于修复应用程序的内存泄漏非常有用:
*首先,运行应用程序然后马上退出。如果这样操作也产生内存泄漏,先修复这些漏洞。只有先修复这些主要的泄漏,你才能进行特定功能的测试。
*在你的delphi/C++Builder工程选项中,尽可能地不要使用自动创建窗体,你需要时再动态创建。
* 注意在循环中创建或分配的内存的代码。如果它们未释放,可能引起大量的内存泄漏。
*先修复大的类,比如你看到TMyFom 类有泄漏,先解决它的问题,然后再解决像TFont 这样的小类。一个form类经常包含多个子类。修复一个form的未释放问题,你将解决大量该form包含的子对象未释的问题。
*首先修复容易修复的漏洞。一些泄漏是非常容易被发现的,如果你先修复他们,你就不用老想着他们了。
这五句话基本上可以总结怎样用此代码来检查内存泄漏和以后在写代码时需要注意的方面,下面我把自己在检查时的一些心得写出来,给大家参考一下。
在我的做的项目中,只有MainForm是程序自动创建的,其它窗口都是用代码创建,其中有一个公共类是用来格式化窗体控件的。在检查中发现一个奇怪的问题。在MainForm中使用此类时,在关闭窗口即OnClose时必须调用此类的Free,而其它代码创建的窗口中不需要调用,直接Close就可以了。如果在代码创建的窗口中调用了类的Free那么就会出现内存泄漏使程序无法运行。我想这就是自动创建和手创建窗口、Show和ShowModal的区别所在吧。其原因我暂时还没有了解的很明白,望有高人指点。
总结一下,大多数出现内存泄漏的原因都是对象没有释放造成的,而且一个对象没有释放会引成很多的内存泄漏,因为有些类是相互继承的关系,好的代码书写规范还是非常重要的。最后愿有同样问题的朋友早日解决。
附:内存泄漏检查单元 此单元的使用请参考http://www.cnblogs.com/abchjb/articles/18685.html
在网上http://www.cnblogs.com/abchjb/articles/18685.html发现了检查内存泄漏的代码,使我在两天时间内修复了很多的BUG,在此感谢一下。内存泄漏测试及修复的技巧在前面的URL里都已经提到,下面把我觉得关键的地方列出来。
下面的这些技巧对于修复应用程序的内存泄漏非常有用:
*首先,运行应用程序然后马上退出。如果这样操作也产生内存泄漏,先修复这些漏洞。只有先修复这些主要的泄漏,你才能进行特定功能的测试。
*在你的delphi/C++Builder工程选项中,尽可能地不要使用自动创建窗体,你需要时再动态创建。
* 注意在循环中创建或分配的内存的代码。如果它们未释放,可能引起大量的内存泄漏。
*先修复大的类,比如你看到TMyFom 类有泄漏,先解决它的问题,然后再解决像TFont 这样的小类。一个form类经常包含多个子类。修复一个form的未释放问题,你将解决大量该form包含的子对象未释的问题。
*首先修复容易修复的漏洞。一些泄漏是非常容易被发现的,如果你先修复他们,你就不用老想着他们了。
这五句话基本上可以总结怎样用此代码来检查内存泄漏和以后在写代码时需要注意的方面,下面我把自己在检查时的一些心得写出来,给大家参考一下。
在我的做的项目中,只有MainForm是程序自动创建的,其它窗口都是用代码创建,其中有一个公共类是用来格式化窗体控件的。在检查中发现一个奇怪的问题。在MainForm中使用此类时,在关闭窗口即OnClose时必须调用此类的Free,而其它代码创建的窗口中不需要调用,直接Close就可以了。如果在代码创建的窗口中调用了类的Free那么就会出现内存泄漏使程序无法运行。我想这就是自动创建和手创建窗口、Show和ShowModal的区别所在吧。其原因我暂时还没有了解的很明白,望有高人指点。
总结一下,大多数出现内存泄漏的原因都是对象没有释放造成的,而且一个对象没有释放会引成很多的内存泄漏,因为有些类是相互继承的关系,好的代码书写规范还是非常重要的。最后愿有同样问题的朋友早日解决。
附:内存泄漏检查单元 此单元的使用请参考http://www.cnblogs.com/abchjb/articles/18685.html