zoukankan      html  css  js  c++  java
  • C++内存检测函数_CrtSetBreakAlloc()

    在关闭C++的程序后,在VS编译器的 Output窗口后

    出现如下情况:

    <span style="font-size:18px;">f:ddvctoolsvc7libsshipatlmfcsrcmfcstrcore.cpp(156) : {930} normal block at 0x0075E3F8, 22 bytes long.
     Data: <   w            > 84 CF DF 77 02 00 00 00 02 00 00 00 01 00 00 00 
    {928} normal block at 0x0075E328, 60 bytes long.
     Data: <   wd     u ` u > 98 CF DF 77 64 02 00 00 08 E4 75 00 60 E4 75 00 
    {926} normal block at 0x0075E278, 16 bytes long.
     Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    {925} normal block at 0x0075EF18, 16 bytes long.
     Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span>

    出现这种情况说明你的程序出现了内存泄露,单靠这些字符我们只能知道出错的地址是哪里,可是具体在哪里出错我们却无法判断。

    微软提供了

    long _CrtSetBreakAlloc( 
       long lBreakAlloc 
    );
    参数:lBreakAlloc 分配订单数,可以设置断点。

    返回值:返回放置断点设置以前的对象分配订单号。

    _CrtSetBreakAlloc 允许应用程序通过中断执行内存泄漏检测到特定点内存分配和跟踪回请求的原点。 函数使用的对象分配订单数量分配内存块时在堆中分配。

    例子:

    BOOL TMApp::InitInstance()
    {
      _CrtSetBreakAlloc(928);//928为出现泄露的内存地址
     ...

    }

    这样当运行到928这块地址值程序就会进入DeBug断点模式,我们就可以根据 Call Stack 找到内存泄露在代码中的位置了。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    记一次简单的正则表达式匹配实践
    使用readlines()读取文件时出现/n及其解决办法
    浅谈http和https
    JVM GC回收原理的认识
    Mysql中语言分类和区别
    关于storm程序性能压测记录及总结
    Java 集合框架
    MySQL binlog底层主从同步原理
    Docker-Compose安装
    gcc手动安装
  • 原文地址:https://www.cnblogs.com/lovelyx/p/4867105.html
Copyright © 2011-2022 走看看