zoukankan      html  css  js  c++  java
  • 快速定位内存泄漏的位置

    每次分配内存系统都会分配一个内存序列标志,通过_CrtIsMemoryBlock函数可以获取这个序列标志值以及分配的文件名和行号位置:

            int* pNum = (int*)_malloc_dbg(12, _NORMAL_BLOCK, __FILE__, __LINE__);

             ...

             ...

             ...

            long lReg = 0;

            char szFile[MAX_PATH];

            PSTR pszFile = szFile;

            int nLine = 0;

            _CrtIsMemoryBlock (pNum, 12, &lReg, &pszFile, &nLine);

    MFC程序中出现内存泄漏时,程序结束会输出内存泄漏信息,如:

    Detected memory leaks!

    Dumping objects ->

    {56} normal block at 0x003F69D8, 12 bytes long.

     Data: <            > CD CD CD CD CD CD CD CD CD CD CD CD

    Object dump complete.

    其中56就是泄漏的内存的序列标志值,在Debug模式下可以利用_CrtSetBreakAlloc函数使程序运行到分配该内存的位置时中断,以便查找确切的泄漏位置,如:

    _CrtSetBreakAlloc(56);

    这样程序运行到分配该位置的内存时就会发生中断,通过调用堆栈可以查看泄漏的代码位置。

    _CrtSetBreakAlloc函数的调用位置需在分配内存之前,如果不知道分配内存在哪里,那就放到程序运行的开始处,如_tWinMain入口函数的开始处。

  • 相关阅读:
    Java 拆分 PDF 文档
    [Java] Spire.Cloud.Word 在Word 文档中添加、删除形状
    Java 生成Word文档
    Java 添加文本框到 PPT 幻灯片
    Linux下kafka的安装及配置
    Linux下zookeeper的安装及配置
    Linux下pip的安装及配置
    Linux安装Python环境
    Linux安装jdk8
    SnowNLP——获取关键词(keywords(1))
  • 原文地址:https://www.cnblogs.com/fangkm/p/1692648.html
Copyright © 2011-2022 走看看