转载地址:http://www.cnitblog.com/martin/archive/2006/04/21/9460.html
首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。
我们来看看:
F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp(
54
):{
86
}normalblockat
0x00422E80
,
10
bytes
long
.
Data:
<
>
1F1F1F1F1FCDCDCDCDCD
F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp(
54
)
告诉我们MFC认为是在该文件的54行,发生了内存泄漏。你双击改行就可以转到该文件的54行了。但是有时候这一信息并不能用来准确判断,比如:MFC可
能报告Strcore.cpp文件的某行,实际上这是CString的实现函数,此时并不知道什么时候发生了内存泄漏。
此时我们需要更多的信息。那么我们看看紧接其后的:
{
86
}normalblockat
0x00422E80
,
10
bytes
long
.
Data:
<
>
1F1F1F1F1FCDCDCDCDCD
它告诉我们:在第86次分配的内存没有释放,一共有10字节,内容移16进制方式打印给我们看。
有了这些信息,我们可以开始调试内存泄漏了。
按下F10在程序的刚开始处,停下来,打开Watch窗口:
在Watch窗口中输入:
{,,msvcrtd.dll}_crtBreakAlloc
然后更改值为上文提到的分配次数:86
接着按下F5继续,然后在第86次分配的时候会发生中断:
然后我们打开堆栈窗口:
往回查看最近我们自己的代码,双击堆栈我们自己的函数那一层,上图有绿色三角的那一层。就定位到泄漏时分配的内存了。
From: http://www.cnitblog.com/Raistlin/archive/2005/12/14/5380.html
刚刚在IT博客网闲逛的时候看到了孤独的夜
的一片文章《如何调试MFC中的内存泄漏
》,讲道用设置{,,msvcrtd.dll}_crtBreakAlloc这个变量
来调试内存泄露的问题。
在How to use _crtBreakAlloc to debug a memory allocation
你可以找到英文的更完整的版本,静态链接和动态连接到C运行库的名称是不一样的
静态:_crtBreakAlloc
动态:{,,msvcr40d.dll}*__p__crtBreakAlloc() (vc++4.0 和4.1版本,估计没人在用吧)
{,,msvcrtd.dll}*__p__crtBreakAlloc() (Visual C++ 4.2 or later)
{,,msvcrtd.dll}_crtBreakAlloc (好像这样也是可以的)
{,,msvcrtd.dll}__p__crtBreakAlloc()是个什么东西呢?
查看msdn索引“Advanced Breakpoint”and you will find out...
语法如下:
{[function],[source],[exe] } location
{[function],[source],[exe] } variable_name
{[function],[source],[exe] } expression
分享到:
相关推荐
2. 伪内存泄漏:在MFC中,有时由于全局对象或静态对象的生命周期问题,导致它们在程序结束前未能释放内存,这会被调试器误报为内存泄漏。例如,如果一个静态成员函数创建了一个对象,该对象在其生命周期结束后未被...
本资源“MFC程序观察内存泄漏.rar”聚焦于如何在使用Microsoft Foundation Class (MFC)库开发的应用程序中检测和处理内存泄漏。MFC是微软为Windows应用程序设计的一个C++类库,它提供了许多用于构建图形用户界面的类...
10. **测试与调试**:最后,对你的内存使用监视器进行充分的测试,确保其在不同情况下都能准确地显示内存信息,并且自身不会产生内存泄漏问题。 通过以上步骤,你可以构建一个基本的MFC内存使用监视器。当然,这个...
1. **内存泄漏检测**: MFC在调试模式下提供了一种内存泄漏检测机制。当程序结束时,如果存在未释放的内存,MFC会报告内存泄漏的详细信息。 2. **afxTraceMemory**: MFC提供了一个全局函数`afxTraceMemory`,用于在...
6. `vc++6_0中内存泄漏请教如何释放 - vc-mfc基础类 - 开发者档案.htm`: 专门针对VC++6.0中的内存管理问题,可能包含了释放内存的指导。 7. `本段程序执行时,内存不断增加,CPU占用迏50%,高手指出原因界面VC-MFC....
- MFC提供`_AFX_MEM_DEBUG`宏,当开启调试模式时,可以帮助检测内存泄漏。通过跟踪分配和释放,MFC可以在程序结束时报告未释放的内存块。 5. **内存池技术** - MFC使用内存池技术提高小对象的分配效率。通过预先...
在软件开发过程中,尤其是使用C++这类需要手动管理内存的语言时,内存泄露是一个常见的问题。内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间的推移,这些未释放的内存会逐渐积累,导致系统...
总的来说,解决MFC程序中的内存泄露问题需要深入理解MFC内存管理机制,合理利用智能指针,以及熟练运用各种调试和分析工具。通过对代码的仔细审查和测试,我们可以找到并修复内存泄露,提升程序的稳定性和效率。
首先,VC++的MFC(Microsoft Foundation Classes)框架在DEBUG版本中,会自动集成内存泄漏检测功能。当程序运行结束后,如果存在内存泄漏,Debug窗口会显示泄漏内存块的相关信息,包括分配内存的源文件、行号、内存...
内存泄漏是编程中常见的问题,尤其在C++等语言中,由于手动管理内存,开发者需要自行负责内存的分配和释放。内存泄漏发生时,程序分配的内存没有被正确释放,导致系统资源浪费,严重时可能导致程序性能下降甚至崩溃...
当在Visual C++ 6.0环境中运行调试版本时,如果发生内存泄漏,将在“Output”窗口的“Debug”页面中显示相关信息,帮助开发者快速定位问题所在。 ### 总结 通过以上介绍,我们可以看出,虽然Visual C++ 6.0自带了...
这样做既能保留MFC项目的内存检测能力,又能在非MFC代码中使用`debugnew`进行精细的内存泄漏分析。 #### 总结 `debugnew`作为一种轻量级且有效的内存泄露检测工具,通过重载`new`和`delete`操作符,在不显著增加...
在实际开发中,除了上述的技术实现外,还需要注意解决可能出现的问题,如COM初始化失败、内存泄漏、以及线程安全等问题,这些都需要在程序设计和调试过程中仔细处理。通过上述知识的深入理解,开发者将能够更好地...
这样的工具对于调试、性能优化和防止内存泄漏至关重要。内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能短时间内不会造成问题,但长时间运行或者频繁发生泄漏,会消耗掉大量系统资源...
本文详细介绍了在VC++环境下如何检测内存泄漏,包括基本概念、实现原理、示例输出以及如何在非MFC程序中实现内存泄漏检测。通过使用Microsoft运行时库提供的Debug功能,开发人员可以更加方便地定位并修复内存泄漏...
C++提供的内存管理机制非常灵活,内存的分配和释放完全有程序员自己控制...内存泄露除了堆中的之外,还包括核心系统资源的内存泄露。那么在STL中目前增加了Smart Point技术,在Java有垃圾回收技术。不过C++中Smart Poi