怎样看内存条在哪个位置的详细信息。

今天调试程序,发现有内存泄漏但是没有提示具体是哪一行,搞得我很头疼。结果在网上搜索了一些资料,经自己实践后整理如下:

    第一种:通过"OutPut窗口"定位引发内存泄漏的代码(下面转,我写的没原文好,也懒得写)。

我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。例如:

产生的内存泄漏报告大体如下:

这挺好。问题是,如果我们不喜欢MFC,那么难道就没有办法?或者自己做? 

呵呵,这不需要。其实,MFC也没有自己做。内存泄漏检测的工作是VC++的C运行库做的。也就是说,只要你是VC++程序员,都可以很方便地检测内存泄漏。我们还是给个样例:

 运行(提醒:不要按Ctrl+F5,按F5),你将发现,产生的内存泄漏报告与MFC类似,但有细节不同,如下:

你已经发现程序存在内存泄漏。现在的问题是,我们要找泄漏的根源。

一般我们首先确定内存泄漏是由于哪一句引起。在MFC中,这一点很容易。你双击内存泄漏报告的文字,或者在Debug窗口中按F4,IDE就帮你定位到申请该内存块的地方。对于上例,也就是这一句:

这多多少少对你分析内存泄漏有点帮助。特别地,如果这个new仅对应一条delete(或者你把delete漏写),这将很快可以确认问题的症结。 

我们前面已经看到,不使用MFC的时候,生成的内存泄漏报告与MFC不同,而且你立刻发现按F4不灵。那么难道MFC做了什么手脚? 

其实不是,我们来模拟下MFC做的事情。看下例: 

再运行这个样例,你惊喜地发现,现在内存泄漏报告和MFC没有任何分别了。

    第二种方法:直接定位指定内存块错误的代码行(下面转)。

单确定了内存泄漏发生在哪一行,有时候并不足够。特别是同一个new对应有多处释放的情形。在实际的工程中,以下两种情况很典型: 

  • 创建对象的地方是一个类工厂(ClassFactory)模式。很多甚至全部类实例由同一个new创建。对于此,定位到了new出对象的所在行基本没有多大帮助。 
  • COM对象。我们知道COM对象采用Reference Count维护生命周期。也就是说,对象new的地方只有一个,但是Release的地方很多,你要一个个排除。

那么,有什么好办法,可以迅速定位内存泄漏?

在内存泄漏情况复杂的时候,你可以用以下方法定位内存泄漏。这是我个人认为通用的内存泄漏追踪方法中最有效的手段。

我们再回头看看crtdbg生成的内存泄漏报告: 

除了产生该内存泄漏的内存分配语句所在的文件名、行号为,我们注意到有一个比较陌生的信息:{52}。这个整数值代表了什么意思呢?

其实,它代表了第几次内存分配操作。象这个例子,{52}代表了第52次内存分配操作发生了泄漏。你可能要说,我只new过一次,怎么会是第52次?这很容易理解,其他的内存申请操作在C的初始化过程调用的呗。:)

有没有可能,我们让程序运行到第52次内存分配操作的时候,自动停下来,进入调试状态?所幸,crtdbg确实提供了这样的函数:即 long _CrtSetBreakAlloc(long nAllocID)。我们加上它:

一句时,自动停下来进入调试状态。细细体会一下,你可以发现,这种方式你获得的信息远比在程序退出时获得文件名及行号有价值得多。因为报告泄漏文件名及行号,你获得的只是静态的信息,然而_CrtSetBreakAlloc则是把整个现场恢复,你可以通过对函数调用栈分析(我发现很多人不习惯看函数调用栈,如果你属于这种情况,我强烈推荐你去补上这一课,因为它太重要了)以及其他在线调试技巧,来分析产生内存泄漏的原因。通常情况下,这种分析方法可以在5分钟内找到肇事者。

当然,_CrtSetBreakAlloc要求你的程序执行过程是可还原的(多次执行过程的内存分配顺序不会发生变化)。这个假设在多数情况下成立。不过,在多线程的情况下,这一点有时难以保证。

个人心得:我在用这种方法时开始没看懂,后来在MSDN中也找到了这方面相关的信息,后来才会用。我感觉在这方面网上介绍的不够详细,下面我就相对详细地解释一下(为什么用“相对详细”?本人比较懒)。首先说明一下,下面的函数不需要上面所添加的宏定义和"crtdbg.h"头文件,也不需要EnableMemLeakCheck()函数。只需在main函数一开始运行 _CrtSetBreakAlloc(long (4459))函数。其中4459是申请内存的序号(上面有说明),然后F5运行(不需要设断点),然后会出现“Find Source”这个对话框,点击“取消”。然后会出现“User breakpoint called from code at xxxx”的对话框,点击“确定”,会看到一些汇编的代码(不要怕,其实我也看不懂,算然原来学过点汇编),调出堆栈窗口(call stack),在其中的“main() line xxx + xxx bytes”上双击(或它的上一行双击,我的上一行是一个自定义函数,双击后直接定位到我new的地方,定位还是很准的,开始我怀疑,但最后检查果然是这地方没释放)会定位到错误行。

第三种:用Ctrl+B来设定,不过现在好像忘了。效果根第二种方法基本一样。

有人会问,既然第一种方法定位没问题,为什么还要介绍第二种?其实在实际应用中,某些内存泄漏它没有定位到哪一行的,只有内存块的序号(有可能我用的不太会用),这个时候就需要用第二种方法。

这篇文章主要介绍了python中查看变量内存地址的方法,涉及Python中id使用技巧,需要的朋友可以参考下

本文实例讲述了python中查看变量内存地址的方法。分享给大家供大家参考。具体实现方法如下:

 

希望本文所述对大家的Python程序设计有所帮助。

  • 这篇文章主要介绍了python实现的用于搜索文件并进行内容替换的类,涉及Python针对文件及字符串的相关操作技巧,需要的朋友可以参考下

  • 这篇文章主要介绍了python实现简易内存监控,每隔3秒获取系统内存,当内存超过设定的警报值时,获取所有进程占用内存并发出警报声,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  • 这篇文章主要为大家详细介绍了Pyqt实现无边框窗口拖动及大小改变的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  • 这篇文章主要为大家详细介绍了python版学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  • 这篇文章主要介绍了Python实现Sqlite将字段当做索引进行查询的方法,涉及Python针对sqlite数据库索引操作的相关技巧,需要的朋友可以参考下

  • 今天小编就为大家分享一篇Python列表解析配合if else的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  • 下面小编就为大家分享一篇Windows上使用Python增加或删除权限的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  • 下面小编就为大家带来一篇python计算auc指标实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  • 这篇文章主要介绍了python fabric使用笔记,fabric是一款实现远程操作和部署强大工具,本文就给出了它的多个使用实例,需要的朋友可以参考下

  • 这篇文章主要介绍了Python通过调用mysql存储过程实现更新数据功能,结合实例形式分析了Python调用mysql存储过程实现更新数据的具体步骤与相关操作技巧,需要的朋友可以参考下

1、以身作则,如果连自己都做不好,还怎么当班长? 2、人缘好,我就是由于人缘不好,才改当副班长的。 3、团结同学,我们班有一个班长就是由于不团结同学才不当班长的,他现在是体育委员。 4、要有管理能力,首先要有大嗓门,我们班有位学习委员就是由于声音太轻才以3票之差当不了班长;其次要口齿清楚,让同学能听得懂你说的话;第三要说出有道理的话,让吵闹或打架的同学心服口服;第四,不能包庇好朋友,公正;第五,要搞好师生关系;第六,要严以律己,宽以待人,我们班的第一任班长就是因为“严以待人,宽以律己”才不能继续当下去的。 5、要坚持,我们班的纪律委员就是由于没有恒心,原来的大组长、卫生委员、劳动委员、体育委员、学习委员、小组长等(每个学期都加起来)都被免除了,现在的才当1天的纪律委员要不要免除都在考虑中,还要写说明书。 6、提醒班干部做自己要做的事,要有责任心。我们班的纪律委员就是没有责任心,班长的职务都被罢免了。 7、不要拿出班长的架子,要虚心。 8、关心同学(包括学习)。 9、要及早发现问题,自己可以解决的自己解决;自己不能解决的,早日让班主任解决。 10、要发现班级的好的地方,及时表扬。让全班都照做。 11、不要太担心学习,当个班干部,对以后工作有好处,这是个锻炼的机会,好好当吧,加油! 在高中阶段,学校和老师的规定一般都是为了学生的成绩着想,执行老师的话,其实也是为了大家好。即使有时候打点小报告,只要你的心态的好的,也不是坏事。比如A学习不专心,你用个适当的办法提醒老师去关心他,其实也是为了他好。 总的方针:和同学们组成一个团结的班集体,一切以班集体利益为上(当然不冲突国家、社会和学校利益为前提)。跟上面领导要会说话,有一些不重要的东西能满就满,这对你的同学好,也对你的班好。 再说十五点 一,以德服人 也是最重要的,不靠气势,只靠气质,首先要学会宽容(very important)你才能与众不同,不能和大家“同流合污”(夸张了点),不要有这样的想法:他们都怎么样怎样,我也。如果你和他们一样何来让你管理他们,你凭什么能管理他们? 二,无亲友 说的绝了点,彻底无亲友是不可能,是人都有缺点,有缺点就要有朋友帮助你。不是说,不要交友,提倡交友,但是不能把朋友看的太重,主要不能对朋友产生依赖感,遇到事情先想到靠自己,而不是求助! 三,一视同仁 上边说的无亲友也是为了能更好的能一视同仁,无论是什么关系,在你眼里都应是同学,可能比较难作到,但没有这点,就不可能服众。 四,不怕困难 每个班级里都会一些不听话的那种,喜欢摆谱的那种,不用怕,他们是不敢怎么样的!知难而进才是一个班长应该有的作风。 五,带头作用 我想这点大家都有体会就不多说了 六,打成一片 尽量和大家达成共识,没有架子,不自负不自卑,以微笑面对每一个人,不可以有歧视心理,不依赖老师,有什么事情自己解决,老师已经够累的了。 七,“我是班长” 这句话要随时放在心底,但是随时都不要放在嘴上,有强烈的责任心,时刻以班级的荣誉为主,以大家的荣誉为主。什么事情都冲在最前面。遇事镇定。 八,帮助同学 帮助同学不是为了给大家留下一个好的印象等利益方面的事,是你一个班长的责任,是你应该做的,只要你还是一个班长,你就要为人民服务(夸张)为同学服务。 九,诚实守信 大家应该都知道这个,是很容易作到的,也是很不容易作到,然这两句话并不是矛盾的,不是为了建立一个好的形象,和班级责任也没有什么关系,只是一个人应该有的道德品质。但你必须作到,连这样都做不到,就不可能做成一个好的班长。 十,拿的起放的下 学会放弃也同样重要,学会辨别好与坏。知道什么是该做的,什么是不该做的。 十一,谦虚 认真分析同学给你提的意见,不管是有意的,还是无意的。提出来就有他的想法,有他的动机。要作到一日三醒我身。 十二,心态端正 总之要有一个好的心态,积极向上的心态,把事情往好里想,但同时要知道另一面的危机,遇到事情首先想到的应该是解决问题,而不是别的! 十三,合理的运用身边的人和事 主动,先下手为强,遇到不能够管理的,就可以和其他班干部一起对付,实在不行,就迅速找到老师陈述自己的观点,免得他倒打一耙(尽量少打小报告.) 十四,和老师同学搞好关系. 威信可以提高,你说的话老师也比较相信,可以简单一点的拿到老师的一些特殊授权,而这些授权往往对你的帮助很大. 十五,合理的运用自己的权利和魄力 对付难管理的,权利在他的眼中已经不存在的,就运用你的魄力,用心去交流,努力感动身边的人,感动得他们铭记于心,你就成功了. 一点要加油哦

我要回帖

更多关于 内存条在哪个位置 的文章

 

随机推荐