c++メモリリーク検出(crt)


                                
                                    
            

Visual Studio C (CRT) :

  VC++ IDE , , Output Debug 。 。

   :
#define _CRTDBG_MAP_ALLOC
#include

#include

:#include 。 , 。


_CrtDumpMemoryLeaks();
   ,_CrtDumpMemoryLeaks Output Debug 。 : Detected memory leaks!
Dumping objects ->

C:\Temp\memleak\memleak.cpp(15) : {45} normal block at 0x00441BA0, 2 bytes long.

Data: 41 42

c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {44} normal
block at 0x00441BD0, 33 bytes long.

Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD

c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {43} normal
block at 0x00441C20, 40 bytes long.

Data: < C > 08 02 43 00 16 00 00 00 00 00 00 00 00 00 00 00

Object dump complete.

#define _CRTDBG_MAP_ALLOC , :
Detected memory leaks!

Dumping objects ->

{45} normal block at 0x00441BA0, 2 bytes long.
Data: 41 42

{44} normal block at 0x00441BD0, 33 bytes long.
Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD

{43} normal block at 0x00441C20, 40 bytes long.
Data: < C > C0 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00

Object dump complete.

#define _CRTDBG_MAP_ALLOC
#include
#include

#include
using namespace std;
void main()
{
// char a[100]="you are good";
 while(1)
 {
  char*p;
  
  p=new char[100];

//p=(char*)malloc(100);

_CrtDumpMemoryLeaks();
  delete []p;

 }
 system("pause");
} _CrtDumpMemoryLeaks()

***** : malloc OUTPUT , new 。

 

     #define _CRTDBG_MAP_ALLOC , , , :C:\Temp\memleak\memleak.cpp(15)

   。 , :
xx}: , {45},{44},{43};
   Output , ( , F4, ), , ,_CRTDBG_MAP_ALLOC 。

_CrtSetDbgFlag
   , _CrtDumpMemoryLeaks 。 , ? _CrtDumpMemoryLeaks , :_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); _CrtDumpMemoryLeaks。 : :_CRTDBG_ALLOC_MEM_DF _CRTDBG_LEAK_CHECK_DF。

CRT ( , Debug )
   ,_CrtDumpMemoryLeaks dump Output Debug , , _CrtSetReportMode 。 , 。 , Output :
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

   _CrtSetReportMode , MSDN _CrtSetReportMode 。

 

   , , 。 , , 。 , , 。 —— 。
   , ,“45” , :
Detected memory leaks!

Dumping objects ->

C:\Temp\memleak\memleak.cpp(15) : {45} normal block at 0x00441BA0, 2 bytes long.

Data: 41 42

......

Object dump complete.
  CRT , CRT ( MFC) 。 , N N , N 。( 。) , 。 。 , QuickWatch( ) Watch( ) :

   , Watch , Name :
_crtBreakAlloc
   CRT DLL (/MD ), , :
{,,msvcrtd.dll}_crtBreakAlloc
   , Value 。 , –1。

   Value 。 45。 45 。

   , 。 , , 。 , Call Stack( ) 。 , , , 。

   , , 。 , ( ):
_crtBreakAlloc = 45;
   _CrtSetBreakAlloc :
_CrtSetBreakAlloc(45);

 

   。CRT _CrtMemState。 :
_CrtMemState s1, s2, s3;
   , _CrtMemCheckpoint _CrtMemState 。 :
_CrtMemCheckpoint( &s1 );
   _CrtMemDumpStatistics _CrtMemState , dump :
_CrtMemDumpStatistics( &s1 );
   dump :
0 bytes in 0 Free Blocks.
75 bytes in 3 Normal Blocks.
5037 bytes in 41 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 5308 bytes.
Total allocations: 7559 bytes.

 

#define _CRTDBG_MAP_ALLOC
#include
#include
#include
using namespace std;
extern void fun();
int b=3;
void main()
{
  char*p;
  _CrtMemState s1, s2, s3;
  _CrtMemCheckpoint( &s1 );//
  _CrtDumpMemoryLeaks();
  p=new char[100];

//p=(char*)malloc(100);
  _CrtMemCheckpoint( &s2 );//
  if ( _CrtMemDifference( &s3, &s1, &s2) )// , Debug
     _CrtMemDumpStatistics( &s3 );// Debug  
  system("pause");
}

 

   , , _CrtMemDifference :
_CrtMemCheckpoint( &s1 );//

//

_CrtMemCheckpoint( &s2 );//

//
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );// dump
   ,_CrtMemDifference ( ), ( )。 _CrtMemCheckpoint , _CrtMemDifference , 。 , _CrtMemCheckpoint 。

 

   , normal( )、client( ) CRT 。 , normal client, 。
  1.normal block( ): 。
  2.client block( ): , MFC 。MFC new , 。
  3.CRT block(CRT ): C RunTime Library 。 CRT , CRT , ( CRT )。

   , , :
  1.free block( ): (free) 。
  2.Ignore block( ): 。

 

     VC ++ MFC , , MFC , MFC 。