hur.cn - 华软网

 热门搜索

内存泄漏

  作者:未知    来源:网络    更新时间:2011/8/11
调试程序时,关闭程序老是提示内存泄漏

Dumping objects ->
{9479} normal block at 0x01925A78, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9478} normal block at 0x01934888, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9477} normal block at 0x0192BCD0, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9476} normal block at 0x01931248, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9475} normal block at 0x01916478, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9474} normal block at 0x0191EDC0, 112 bytes long.
 Data: <t_X xd          > 74 5F 58 00 78 64 91 01 00 04 00 00 00 00 00 00 
{9357} normal block at 0x01913A60, 1024 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

...

Object dump complete.

但这类信息又没有提示是哪里出现泄漏。

GOOGLE了一下,_CrtSetBreakAlloc这个可以定位到确切的泄漏点。可是{9357} normal block at 0x01913A60, 1024 bytes long. 这个内在块号{9357} 是动态的,每次都不一样.

如何找到泄漏点?
---华软 网友回答---
你看看你的哪个结构或数组大小是1024或112
---华软网友回复---

好像数据都是全0嘛
---华软网友回复---
关闭时所谓内存泄漏的不用管,程序退出时多注意一下释放的顺序,如果释放不出错就随意了,不释放也行,程序都退出了,那个4G内存空间都没有了

运行时的内存泄漏必须处理好
---华软网友回复---
不要调试模式,你直接运行程序,然后隔一段时间观察看看.
---华软网友回复---
引用 2 楼 zzw820626 的回复:
好像数据都是全0嘛


嗯,每次退出提示的泄漏,数据都为0
---华软网友回复---
引用 4 楼 oyljerry 的回复:
不要调试模式,你直接运行程序,然后隔一段时间观察看看.


运行一段时间,内存在一点点的漏。而且发现,运行时间越长
{9357} normal block at 0x01913A60, 1024 bytes long.
 Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  

关闭时内存块号{9357}就越大
---华软网友回复---
VS工具确实能暴露有内存泄露,但是定位在哪,网上有很多方法,我总结的经验给你,觉得好就试试,
(1)内存泄露的程序运行时,打开任务管理器,找到程序所在的进程,其“内存使用”一栏会不停增长
(2)内存泄露多出现在new没有delete和GDI资源的泄露,认真排除这两点
我以前写过双缓冲实时绘制曲线,就没有releaseDC的好习惯,最后程序跑一个小时就崩溃。至于new,要注意数组的delete要有[]


---华软网友回复---
希望你可以用boundschecker调试一下,看看内存如何。
---华软网友回复---
vc中主要要注意new了之后一定要delete!
---华软网友回复---
花括号里的那个数字叫 object allocation order number,你在程序开始的时候调用 _CrtSetBreakAlloc(),把那个值传进去,这样再次运行后,当那个内存块被分配时,程序会中断,你就知道是哪里分配的内存最终没有释放了。

多数情况下每次运行时 object allocation order number 都是固定的,这种方法就可以了,但有的程序每次运行时这个 number 都不同,这个办法就不灵了。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
---华软网友回复---
sorry, 看贴不仔细,楼主已经说了这个方法不灵,汗~~~

那就推荐另外一个办法吧,用 _CrtSetAllocHook() 设一个钩子,检查所有的内存分配请求,发现尺寸为 1024 的就停一下看看。方法虽然有点糙,但有时候能管用。


--------
With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is
hard to be sure where they are going to land, and it could be dangerous sitting under them as they
fly overhead.
  style="text-align: center;">出自 RFC1925 - The Twelve Networking Truths
---华软网友回复---
引用楼主 jxcr1984 的回复:
调试程序时,关闭程序老是提示内存泄漏

Dumping objects ->
{9479} normal block at 0x01925A78, 1024 bytes long.
 Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{9478} normal block at 0x01934888, 1024 byte……


前段时间刚碰到这个问题,还好当时写了个日志备忘
详见:http://user.qzone.qq.com/279598584/infocenter
---华软网友回复---
检查你程序里所有和分配内存有关的位置
---华软网友回复---
windbg 
---华软网友回复---
搜索你程序里面的new字符在哪里。。
---华软网友回复---
这个不准的,装个boundcheck来测测:)
---华软网友回复---
靠谱,不过我推荐Visual Leak Detector
引用 14 楼 babala2009 的回复:
windbg
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。