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

援用原作地址

 

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

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

 

2. 必须是Debug版的build

Q : LiteServer遍Debug也许会蒙受有些主题材料

A : 能够用来验证Memcheck是不是有误报。

   
能够在对应的地址处下断点(会频仍断在malloc上,须求基于size下规范断点卡塔 尔(英语:State of Qatar)

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

 

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}卡塔 尔(英语:State of Qatar),当分配该大小的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:codesvs2010testdetectmemleakconsoletest.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的行号