如何调试MFC中的内存泄漏

               

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

 

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

 

    image001

 

      我们来看看:  

           F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp(               54               ) : {               86               } normal block at                0x00422E80               ,                10                bytes                long               .
 Data:                <                                        >                1F 1F 1F 1F 1F CD CD CD CD CD 
      

      
         F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp(54)告诉我们MFC认为是在该文件的54行,发生了内存泄漏。你双击改行就可以转到该文件的54行了。但是有时候这一信息并不能用来准确判断,比如:MFC可能报告Strcore.cpp文件的某行,实际上这是CString的实现函数,此时并不知道什么时候发生了内存泄漏。



         此时我们需要更多的信息。那么我们看看紧接其后的:

 

           {               86               } normal block at                0x00422E80               ,                10                bytes                long               .
 Data:                <                                        >                1F 1F 1F 1F 1F CD CD CD CD CD 
      

      
         它告诉我们:在第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

 


 

 

 

 

 

 


 

 

 

 

 

 


 

 

 

 

 

 

 

 


 

 


 


 

 

 

 


 

 

 

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC是微软公司开发的一组用于Windows操作系统的C++类库。要在MFC读取Excel的图片,需要使用Microsoft Office Interop API。该API提供了访问Office文档的组件,从而可以通过MFC代码读取和处理Excel文件的图片。 首先,需要在MFC项目添加对Microsoft Office Interop组件的引用,以便在代码使用该组件。然后,通过创建Excel应用程序对象、打开Excel文件、选择特定工作表、遍历单元格以及获取图像对象等步骤来读取Excel的图片。 为了获取Excel的图像,我们可以使用Excel工作簿对象的Shapes属性。这个属性返回一个包含工作表上所有图像的集合。通过遍历集合的图像对象,我们可以访问图像的数据并将其保存到本地路径。 在实现,需要加入一些错误处理和异常捕捉的代码,以保证程序的健壮性和稳定性。此外,还需要注意Excel文件以及其的图像对象可能对程序有特定的格式或大小要求,需要进行测试和调试以确保代码的正确性。 总体而言,使用MFC读取Excel的图片需要一定的编码能力和经验,但通过使用Microsoft Office Interop API和适当的开发过程,可以实现高效、可靠的程序,可以用于各种实际应用。 ### 回答2: 在MFC读取Excel的图片,需要使用OLE(对象链接和嵌入)技术,其实就是将Excel的图片转换为二进制数据,并将其加载到MFC。下面是实现步骤: 1.先使用MFC的COleVariant类打开Excel文件,读取Excel的图片及其相关信息。 2.使用COleDispatchDriver类,获取Excel对象的Application类,打开指定的工作表,并在其定位到所需的单元格。 3.通过Excel的Range对象,获取单元格的地址和边框信息等,再通过Shapes属性,获取该单元格的所有图片信息。 4.遍历Shapes集合,找到需要读取的图片,然后使用Picture对象的Copy方法,将图片转换为二进制数据。 5.将获取到的图片数据转换成位图模式,保存到磁盘或内存,并将其显示在MFC的视图或对话框。 需要注意的是,在读取Excel的图片时,可能存在多个图片并存的情况,为了避免混淆,可以先指定需要读取的单元格,然后根据图片名称或编号来获取特定的图片。同时,也要注意Excel文件格式的差异性,不同版本的Excel文件对应不同的COM接口,需要根据具体的版本进行适配。 ### 回答3: 使用MFC库读取Excel的图片需要以下步骤: 1. 打开Excel文件,使用COleVariant对文件路径进行包装,用COleDispatchDriver打开Excel应用程序。 2. 使用COleDispatchDriver获取Excel的工作表并选择要读取的工作表。 3. 使用COleDispatchDriver获取单元格的内容,并将其缓存到位于内部缓存的CMemoryStream对象。 4. 使用GDI+的Image类将CMemoryStream的内容转换为位图。 5. 将位图绘制在需要显示图片的控件。 6. 关闭Excel应用程序和文件。 在实现过程需要注意以下几点: 1. 在读取Excel文件时,需要选择正确的文件格式,不同版本的Excel文件格式略有不同。 2. 通过调用关闭函数来正确地释放已打开的Excel应用程序和文件,避免出现内存泄漏的情况。 3. 若要展示Excel的多个图片,可以使用MFC的不同控件来实现。比如使用Image控件、Static控件或Picture控件。 在使用MFC库读取Excel的图片时,需要熟练掌握MFC库和GDI+的相关知识,结合实际情况选择合适的控件和方法来实现,才能更好地完成任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值