用CRT查找内存泄漏

2019-12-14 03:33栏目:操作系统
TAG:

 

  1 #define _CRTDBG_MAP_ALLOC
  2 #include <stdlib.h>
  3 #include <crtdbg.h>

    能够在相应的地点处下断点(会频仍断在malloc上,须要根据size下标准断点)

A :  Debug,在app入口断下后,在watch窗口输入"_crtBreakAlloc"(假诺"Runtime Library"是"/MD",则还索要加上"{,,ucrtbased.dll}_crtBreakAlloc"),那些值应该是"-1",校勘成detect到的memory leak的分配序号(如7中的{18}),当分配该大小的memory时就能断下来(注意,重跑后的法规要和第叁回得到分配序号的同后生可畏)。

_CrtDumpMemoryLeaks();

1> code

 

A : 那个crtdbg对new处理倒霉,其block的地址只会new调用macro的地址,可用如下宏DBG_NEW来代替new,以打字与印刷出相应的行消息

 

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

Q : LiteServer遍Debug大概会境遇一些难题

A :不会

8. Test

 

4. 在app exit前,能够调用那些function打印memory leak report

#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 : 发掘即便根据第一条中的定义,也不会输出memory leak的行音信。

A : 能够用来表明Memcheck是还是不是有误报。

Q : 未有栈回溯消息,多层调用怎么查找源头音讯?

2> result

5. 假若app有五个exits,你是不必要call _CrtDumpMemoryLeaks(卡塔尔(英语:State of Qatar)在各种exit地点的。在app开端的职责call下边那一个_CrtSetDbgFlag(卡塔尔国,其会自行在种种exit的岗位自动call _CrtDumpMemoryLeaks()

    此外,在code中也足以一直钦点:

 

Data: <    > CC 00 00 00

Object dump complete.

3. "#define _CRTDBG_MAP_ALLOC"这么些宏不可能大约,不然memory leak的dump会缺乏一些细节(如leak的code地方音信)

 

Q : 假设是大局或静态obj,在exit前其还未有释放,这时report不会形成误报吗?

1. 在program中严苛按上边顺序include

 

2. 必须是Debug版的build

Q : code在Release和Debug版下大概会差异等,最终可能会冒出一个有memory leak三个未曾

Q : 供给替换全体的源码,何况第三方库怎么办?

Detected memory leaks!

Dumping objects ->

c:usersusernamedocumentsprojectsleaktestleaktest.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.

 

 

#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));
}
_crtBreakAlloc = 18;

    or :

_CrtSetBreakAlloc(18);

 

7. Report格式

引用原来的文章地址

6. 私下认可情状下,memory leak的report会在VS Studio Debug窗的Output窗口中,能够用_CrtSetReportMode(卡塔尔(قطر‎将其重定向到此外义务。

白色部分是new出来的memory leak,可以看到并不会报出相应的code的行号

Detected memory leaks!

Dumping objects ->

d:codesvs2010testdetectmemleakconsoletest.cpp(14) : {65} normal block at 0x007B18A8, 4 bytes long.

Data: <    > CD CD CD CD

 

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

版权声明:本文由bob体育app发布于操作系统,转载请注明出处:用CRT查找内存泄漏