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 。