`
happmaoo
  • 浏览: 4472673 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何调试MFC中的内存泄漏

阅读更多

转载地址:http://www.cnitblog.com/martin/archive/2006/04/21/9460.html

首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。

image001

我们来看看:

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窗口:

image002

在Watch窗口中输入:

{,,msvcrtd.dll}_crtBreakAlloc

image003

然后更改值为上文提到的分配次数:86

image004

接着按下F5继续,然后在第86次分配的时候会发生中断:

image005

然后我们打开堆栈窗口:

image006

往回查看最近我们自己的代码,双击堆栈我们自己的函数那一层,上图有绿色三角的那一层。就定位到泄漏时分配的内存了。

image008

你也许还没用过的vc++的调试的功能

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








分享到:
评论

相关推荐

    mfc伪内存泄漏测试代码

    2. 伪内存泄漏:在MFC中,有时由于全局对象或静态对象的生命周期问题,导致它们在程序结束前未能释放内存,这会被调试器误报为内存泄漏。例如,如果一个静态成员函数创建了一个对象,该对象在其生命周期结束后未被...

    MFC程序观察内存泄漏.rar

    本资源“MFC程序观察内存泄漏.rar”聚焦于如何在使用Microsoft Foundation Class (MFC)库开发的应用程序中检测和处理内存泄漏。MFC是微软为Windows应用程序设计的一个C++类库,它提供了许多用于构建图形用户界面的类...

    MFC实现内存使用监视器

    10. **测试与调试**:最后,对你的内存使用监视器进行充分的测试,确保其在不同情况下都能准确地显示内存信息,并且自身不会产生内存泄漏问题。 通过以上步骤,你可以构建一个基本的MFC内存使用监视器。当然,这个...

    MFC教程_ 内存分配方式和调试机制

    1. **内存泄漏检测**: MFC在调试模式下提供了一种内存泄漏检测机制。当程序结束时,如果存在未释放的内存,MFC会报告内存泄漏的详细信息。 2. **afxTraceMemory**: MFC提供了一个全局函数`afxTraceMemory`,用于在...

    CString内存泄露HTML.rar

    6. `vc++6_0中内存泄漏请教如何释放 - vc-mfc基础类 - 开发者档案.htm`: 专门针对VC++6.0中的内存管理问题,可能包含了释放内存的指导。 7. `本段程序执行时,内存不断增加,CPU占用迏50%,高手指出原因界面VC-MFC....

    mfc内存管理界面.rar

    - MFC提供`_AFX_MEM_DEBUG`宏,当开启调试模式时,可以帮助检测内存泄漏。通过跟踪分配和释放,MFC可以在程序结束时报告未释放的内存块。 5. **内存池技术** - MFC使用内存池技术提高小对象的分配效率。通过预先...

    VC-开发人员使用内存泄露检查

    在软件开发过程中,尤其是使用C++这类需要手动管理内存的语言时,内存泄露是一个常见的问题。内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间的推移,这些未释放的内存会逐渐积累,导致系统...

    有内存泄露程序

    总的来说,解决MFC程序中的内存泄露问题需要深入理解MFC内存管理机制,合理利用智能指针,以及熟练运用各种调试和分析工具。通过对代码的仔细审查和测试,我们可以找到并修复内存泄露,提升程序的稳定性和效率。

    vc中内存泄露的检测方法

    首先,VC++的MFC(Microsoft Foundation Classes)框架在DEBUG版本中,会自动集成内存泄漏检测功能。当程序运行结束后,如果存在内存泄漏,Debug窗口会显示泄漏内存块的相关信息,包括分配内存的源文件、行号、内存...

    内存泄漏查找方法总结

    内存泄漏是编程中常见的问题,尤其在C++等语言中,由于手动管理内存,开发者需要自行负责内存的分配和释放。内存泄漏发生时,程序分配的内存没有被正确释放,导致系统资源浪费,严重时可能导致程序性能下降甚至崩溃...

    VC6 内存泄漏检测

    当在Visual C++ 6.0环境中运行调试版本时,如果发生内存泄漏,将在“Output”窗口的“Debug”页面中显示相关信息,帮助开发者快速定位问题所在。 ### 总结 通过以上介绍,我们可以看出,虽然Visual C++ 6.0自带了...

    检测内存泄露的工具

    这样做既能保留MFC项目的内存检测能力,又能在非MFC代码中使用`debugnew`进行精细的内存泄漏分析。 #### 总结 `debugnew`作为一种轻量级且有效的内存泄露检测工具,通过重载`new`和`delete`操作符,在不显著增加...

    关于MFC对话框与静态HTML交互

    在实际开发中,除了上述的技术实现外,还需要注意解决可能出现的问题,如COM初始化失败、内存泄漏、以及线程安全等问题,这些都需要在程序设计和调试过程中仔细处理。通过上述知识的深入理解,开发者将能够更好地...

    C++MFC内存监视器.zip

    这样的工具对于调试、性能优化和防止内存泄漏至关重要。内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能短时间内不会造成问题,但长时间运行或者频繁发生泄漏,会消耗掉大量系统资源...

    VC下内存泄漏的检测方法.pdf

    本文详细介绍了在VC++环境下如何检测内存泄漏,包括基本概念、实现原理、示例输出以及如何在非MFC程序中实现内存泄漏检测。通过使用Microsoft运行时库提供的Debug功能,开发人员可以更加方便地定位并修复内存泄漏...

    非MFC的C++内存泄露跟踪与调试

    C++提供的内存管理机制非常灵活,内存的分配和释放完全有程序员自己控制...内存泄露除了堆中的之外,还包括核心系统资源的内存泄露。那么在STL中目前增加了Smart Point技术,在Java有垃圾回收技术。不过C++中Smart Poi

Global site tag (gtag.js) - Google Analytics