内存泄漏——初学者听起来很牛逼的词,其实说白了就是new了以后忘记delete、malloc了以后后忘记free。以前对这个东西不以为然,为何?因为,new申请的内存块如果没有被及时delete,产生的内存碎片在程序结束时依然会被操作系统(Windows)收回。但是前不久在我项目中出现了这样的问题,结束程序后CPU使用率一直50%以上,程序也没有真正停止运行,调试运行发现一大堆类似这样的警告:
Detected memory leaks!
Dumping objects ->
{32842} normal block at 0x0EB46B18, 24 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.......
百度之,发现原来是我不以为然的内存泄露!因为这次用new是为了使用动态数组,由于数据较多,操作系统在回收内存碎片时就耗费了很多时间,使得程序停不下来。
那么怎样解决问题呢?如果是小程序,很容易找到内存泄露的地方,但是在大型项目中代码上万行,如何去找?其实MFC中本来就带有内存泄露检测机制,只要MFC工程Stdafx.h中添加一句#define new DEBUG_NEW即可。再次调试运行就可以发现区别了:
Detected memory leaks!
Dumping objects ->
F:/VC++/程序/DrillVision/Grid.cpp(163) : {2417} normal block at 0x0E90E730, 24 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.......
警告消息中就可以定位内存泄漏的地方了。
但是如果不是MFC程序,要检测内存泄露就有点麻烦了,具体办法见http://blog.vckbase.com/bruceteen/archive/2004/10/28/1130.aspx
http://hi.baidu.com/carelock/blog/item/e2fff8d16cc264d6572c8449.html
至于MFC内存泄露检测机制,见:
http://www-128.ibm.com/developerworks/cn/linux/l-mleak2/index.html

1616

被折叠的 条评论
为什么被折叠?



