引用原文地址

https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

1. 在program中严格按下面顺序include

 #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

2. 必须是Debug版的build

Q : LiteServer遍Debug可能会遇到一些问题

A : 可以用来验证Memcheck是否有误报。

可以在对应的地址处下断点(会频繁断在malloc上,需要根据size下条件断点)

Q : code在Release和Debug版下可能会不一样,最后可能会出现一个有memory leak一个没有

3. "#define _CRTDBG_MAP_ALLOC"这个宏不能省略,否则memory leak的dump会缺少一些细节(如leak的code位置信息)

4. 在app exit前,可以调用这个function打印memory leak report

_CrtDumpMemoryLeaks();

Q : 如果是全局或静态obj,在exit前其还未释放,此时report不会造成误报吗?

A :不会

5. 如果app有多个exits,你是不需要call _CrtDumpMemoryLeaks()在每个exit位置的。在app开始的位置call下面这个_CrtSetDbgFlag(),其会自动在每个exit的位置自动call _CrtDumpMemoryLeaks()

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

6. 默认情况下,memory leak的report会在VS Studio Debug窗的Output窗口中,可以用_CrtSetReportMode()将其重定向到其他位置。

7. Report格式

Detected memory leaks!

Dumping objects ->

c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18}               //{18} : memory分配序号 

normal block at 0x00780E80, 64 bytes long.                                         //64 bytes : block的大小(并不是分配时指定的大小,因为分配的heap由于会添加堆头堆尾等额外信息,会比分配时指定的size要大) 

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

Object dump complete.
 

Q : 发现即使按照第一条中的定义,也不会输出memory leak的行信息。

A : 这个crtdbg对new处理不好,其block的地址只会new调用macro的地址,可用如下宏DBG_NEW来替代new,以打印出对应的行信息

#ifdef _DEBUG

    #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

    // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the 

    // allocations to be of _CLIENT_BLOCK type 

#else

    #define DBG_NEW new

#endif

Q : 需要替换所有的源码,而且第三方库怎么办?

Q : 没有栈回溯信息,多层调用怎么查找源头信息?

A :  Debug,在app入口断下后,在watch窗口输入"_crtBreakAlloc"(如果"Runtime Library"是"/MD",则还需要添加"{,,ucrtbased.dll}_crtBreakAlloc"),这个值应该是"-1",修改成detect到的memory leak的分配序号(如7中的{18}),当分配该大小的memory时就会断下来(注意,重跑后的条件要和第一次获取分配序号的一致)。

另外,在code中也可以直接指定:

_crtBreakAlloc = 18;

    or :

_CrtSetBreakAlloc(18);

8. Test

1> code

#include <memory>

std ::tr1 ::shared_ptr <int >   sp_nTest;

void  Test ()
{
sp_nTest. reset( new int( 0x88)); //memory leak
int* pnTest = new int( 0xCC); void* pMalloc = malloc( sizeof( int));
}

2> result

Detected memory leaks!

Dumping objects ->

d:\codes\vs2010\test\detectmemleak\console\test.cpp(14) : {65} normal block at 0x007B18A8, 4 bytes long.

Data: <    > CD CD CD CD

{64} normal block at 0x007B4F90, 4 bytes long.

Data: <    > CC 00 00 00

Object dump complete.

红色部分是new出来的memory leak,可见并不会报出对应的code的行号

用CRT查找内存泄漏的更多相关文章

  1. 利用Java剖析工具JProfiler查找内存泄漏的方法

    本文主要介绍如何如何利用在使用JProfiler时意识到内存泄漏以及查找内存泄漏的几种方法. 工具/原料   JProfiler 方法/步骤   JProfiler的内存视图会话提供了内存使用情况的动 ...

  2. 使用CRT定位内存泄漏

    1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...

  3. java命令--jmap命令使用(查找内存泄漏对象)

    转自:https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安装后会自带一些小工具,jmap命令(Java Memory M ...

  4. 【转】使用UMDH查找内存泄漏

    转载出处:http://blog.csdn.net/phiger/article/details/1932141 Umdh 是 Debugging Tools for Windows 里面的一个工具, ...

  5. C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)

    尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FIL ...

  6. Linux 下用 valgrind 查找内存泄漏小例子

    1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...

  7. 教程:查找内存泄漏 (JavaScript)

    本主题带领您完成使用 JavaScript 内存分析器确定并修复简单内存问题的过程.在本教程中,我们创建一个生成大量数据的应用程序.我们预期在导航到新页时该应用程序会释放数据.  说明 JavaScr ...

  8. Windows下使用Gflags和UMDH查找内存泄漏

    GFlags和UMDH与WinDbg一样,都是Debugging Tools for Windows里的工具. 1.设置符号路径 去微软官网下载对应的操作系统的符号安装文件,并安装到某个目录,如C:\ ...

  9. Xcode查找内存泄漏

随机推荐

  1. 固定GridView标题栏,冻结列功能实现

    <%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> < ...

  2. 【记录】Spring项目转化为Spring Web项目

    前言 在将Spring项目转化为Spring Mvc项目时出现了点问题,总是无法成功部署,查阅资料也并没有找到一个完美的解决方案,最后是参考在idea中创建maven web app项目后的目录才成功 ...

  3. 自己动手实现网络服务器(Web Server)——基于C#

    前言 最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用python.PHP写的那部分代码都迁移到了C#(别问我为什么这么喜欢C#),之前使用 ...

  4. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9

    这特么就尴尬了,说好的Vue支持IE8及以下的呢,引入jquery,测试IE个浏览器,IE9仍然显示不正常, 然而命令行测试Vue仍然存在, 数据回不来!数据回不来!数据回不来! 好吧  肉包子打狗$ ...

  5. Linux下文件打包与解压缩

    Linux上存在的文件后缀 文件后缀名 说明 *.zip zip程序打包压缩的文件 *.rar rar程序压缩的文件 *.7z 7zip程序压缩的文件 *.tar tar程序打包,未压缩的文件 *.g ...

  6. SpringMVC 异常的处理

    Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver: (2)实现Spring的异常处理接口Hand ...

  7. Java常用类(四)之数组工具类Arrays

    前言 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作. 一.Arra ...

  8. 用gdb调试python多线程代码-记一次死锁的发现

    | 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有 ...

  9. 找到python官方标准库文档

    python中有很多标准库.我们没法记住全部标准库,但是可以在:https://docs.python.org/3/py-modindex.html 中查看标准库的索引 在python的官方文档中,如 ...

  10. mysql密码更改

    1.用户修改密码: 方法一:mysqladmin -u用户 -p密码 password '新密码' mysqladmin -uroot -pdefault password 'zhouli.cn' 方 ...