C++内存泄漏检测拾遗

在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息。

在非MFC框架中,需要借助CRT函数实现这些功能。

1. 调用_CrtDumpMemoryLeaks()函数会在输出窗口中输出当前的内存泄漏。若在程序开始处加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

语句,CRT会在程序的每个出口处自动调用_CrtDumpMemoryLeaks函数,因此程序终止时会在输出窗口显示所有的内存泄漏。

2.利用_CrtMemState结构定点监测内存泄漏,例:

 //定义3个内存状态
        _CrtMemState s1,s2,s3;

        //记录开始的内存状态
        _CrtMemCheckpoint( &s1 );

        int  *p = new int;

        //记录结束时的内存状态
        _CrtMemCheckpoint( &s2 );

        //比较2个内存状态,并将差异保存到s3中
        if( _CrtMemDifference( &s3, &s1, &s2 ) )
        {
            //输出内存泄漏信息
            _CrtMemDumpAllObjectsSince( &s3 );
        }

3. 重定向输出信息。内存泄漏提示默认是输出在输出窗口中,可以通过_CrtSetReportMode重定向其输出位置。例(重定向输出到指定文件):

  CAtlFile  hFile;
        hFile.Create( _T("D:\\report.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, CREATE_ALWAYS );
        _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
        _CrtSetReportFile( _CRT_WARN, hFile );

此外还可以重定向为窗体提示(带有"终止"、"继续"、"忽略"按钮的窗体),断言就是输出为此窗体。还可以通过_CrtSetReportHook函数在输出到指定目的地之前拦截消息。如:

_CrtSetReportHook( MyReportingFunction );

MyReportingFunction 的定义如下:

 int MyReportingFunction( int nReportType, char *szMsg, int *pRetVal )
{
    *pRetVal = 0;
    if( nReportType == _CRT_WARN )
    {
        AtlMessageBox( NULL, _U_STRINGorID( CA2T(szMsg)));
    }
    return 0;
}

时间: 2024-10-04 09:24:43

C++内存泄漏检测拾遗的相关文章

C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂.久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露.内存管理错误,只要不影响运行,没有读到不该读的东西VS就不会告诉你(应该是VS内部没实现这个内存检测功能),因此用VS写出的程序可能不是

Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

那么在Windows下有什么好的内存泄漏检测工具呢微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能我们可以使用第三方工具Visual Leak Detector以下简称vld. vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪并且包含其源文件及行号信息. 安装过程是先在到地址http://vld.codeplex.com/下载vld安装文件然后进行

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

怎么用弱引用实现内存泄漏检测

在Java中,引用分为强引用.软引用.弱引用和虚引用四种. 强引用,代码中普遍存在的形式,例如常见的普通类new出对象后的引用.GC不会回收强引用的对象. 软引用,软引用对象会在内存溢出异常之前进行回收,也就是说在内存富裕的情况下GC不回收软引用.它可通过SoftReference类实现. 弱引用,弱引用对象会在下一次GC时被回收,也就是说不管内存富不富裕,当GC时都会回收弱引用.它可通过WeakReference类实现. 虚引用,虚引用不会改变对象的生存时间,它只是让对象在被GC时能收到一个系

GDI泄漏和内存泄漏 检测方法

GDI泄漏检测方法: 1.检查是否GetWindowDC(),后是否有 ReleaseDC() 2.CFont *pOldFont=pDC->SelectObject(&m_Font): 后是否有pDC->SelectObject(pOldFont); 3.CBitmap bmp;  bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); 后是否记得bmp.DeleteObject();   内

基于若引用的内存泄漏检测

在Java中,引用分为强引用.软引用.弱引用和虚引用四种. 强引用,代码中普遍存在的形式,例如常见的普通类new出对象后的引用.GC不会回收强引用的对象. 软引用,软引用对象会在内存溢出异常之前进行回收,也就是说在内存富裕的情况下GC不回收软引用.它可通过SoftReference类实现. 弱引用,弱引用对象会在下一次GC时被回收,也就是说不管内存富不富裕,当GC时都会回收弱引用.它可通过WeakReference类实现. 虚引用,虚引用不会改变对象的生存时间,它只是让对象再被GC时能收到一个系

详解Android内存泄漏检测与MAT使用

内存泄漏基本概念 内存检测这部分,相关的知识有JVM虚拟机垃圾收集机制,类加载机制,内存模型等.编写没有内存泄漏的程序,对提高程序稳定性,提高用户体验具有重要的意义.因此,学习Java利用java编写程序的时候,要特别注意内存泄漏相关的问题.虽然JVM提供了自动垃圾回收机制,但是还是有很多情况会导致内存泄漏. 内存泄漏主要原因就是一个生命周期长的对象,持有了一个生命周期短的对象的引用.这样,会导致短的对象在该回收时候无法被回收.Android中比较典型的有:1.静态变量持有Activity的co

gtest的彩色信息输出 + boost.test的内存泄漏检测及定位

gtest 的彩色信息显示看起来比较醒目,boost.test 的内存泄漏检查很实用.真希望两个功能在一个库里,可以省不少事情.不过如果想在作者们没有这么做之前结合使用这两个功能,下面的方法可以试. 1: #include <iostream> 2: 3: #include <gtest/gtest.h> 4: #pragma comment(lib, "gtestd_d.lib") 5: 6: #include <boost/test/unit_test

Linux C/C++内存泄漏检测工具:Valgrind

Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题. Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误: 使用未初始化的内存 (Use of uninitialised memory) 使用已经释放了的内存 (Reading/writing memory after it has been f