_CrtSetAllocHook笔记
每次分配、重新分配或释放内存时都会调用分配挂钩函数,这个挂钩函数可以通过
/*
* 自定义AllocHook函数
* nAllocType:操作类型:分配、重分配、释放(_HOOK_ALLOC、_HOOK_REALLOC、_HOOK_FREE)
* pvData:在释放或重新分配的情况下,指向将释放块;在分配情况下,该指针为空
* nSize: 要分配的大小
* nBlockUse:块类型(_FREE_BLOCK、_NORMAL_BLOCK、_CRT_BLOCK、_IGNORE_BLOCK、_CLIENT_BLOCK)
* lRequest:与它关联的顺序请求编号
* szFileName:进行分配的文件名
* nLine:进行分配的行号
* return: 返回TRUE指示分配操作可以继续,返回FALSE指示分配操作应失败
*/
int MyAllocHook( int nAllocType, void *pvData, size_t nSize, int nBlockUse, long lRequest, const unsigned char * szFileName, int nLine )
{
//_CRT_BLOCK 块是由 C 运行时库函数内部进行的内存分配,必须显式地忽略
if( nBlockUse == _CRT_BLOCK )
return TRUE;
if( nAllocType == _HOOK_ALLOC )
{
CString strHint;
strHint.Format( _T("分配内存 大小:%d; 文件:%s; 行号:%d\n"), nSize, szFileName, nLine );
::OutputDebugString( strHint );
}
else if( nAllocType == _HOOK_REALLOC )
{
CString strHint;
strHint.Format( _T("重分配内存 大小:%d; 文件:%s; 行号:%d\n"), nSize, szFileName, nLine );
::OutputDebugString( strHint );
}
else if( nAllocType == _HOOK_FREE )
{
::OutputDebugString( _T("释放内存 \n") );
}
return TRUE;
}
* 自定义AllocHook函数
* nAllocType:操作类型:分配、重分配、释放(_HOOK_ALLOC、_HOOK_REALLOC、_HOOK_FREE)
* pvData:在释放或重新分配的情况下,指向将释放块;在分配情况下,该指针为空
* nSize: 要分配的大小
* nBlockUse:块类型(_FREE_BLOCK、_NORMAL_BLOCK、_CRT_BLOCK、_IGNORE_BLOCK、_CLIENT_BLOCK)
* lRequest:与它关联的顺序请求编号
* szFileName:进行分配的文件名
* nLine:进行分配的行号
* return: 返回TRUE指示分配操作可以继续,返回FALSE指示分配操作应失败
*/
int MyAllocHook( int nAllocType, void *pvData, size_t nSize, int nBlockUse, long lRequest, const unsigned char * szFileName, int nLine )
{
//_CRT_BLOCK 块是由 C 运行时库函数内部进行的内存分配,必须显式地忽略
if( nBlockUse == _CRT_BLOCK )
return TRUE;
if( nAllocType == _HOOK_ALLOC )
{
CString strHint;
strHint.Format( _T("分配内存 大小:%d; 文件:%s; 行号:%d\n"), nSize, szFileName, nLine );
::OutputDebugString( strHint );
}
else if( nAllocType == _HOOK_REALLOC )
{
CString strHint;
strHint.Format( _T("重分配内存 大小:%d; 文件:%s; 行号:%d\n"), nSize, szFileName, nLine );
::OutputDebugString( strHint );
}
else if( nAllocType == _HOOK_FREE )
{
::OutputDebugString( _T("释放内存 \n") );
}
return TRUE;
}
PS:MyAllocHook的文件名和行号可能不会显示,这时需要定义new或malloc宏到带参数的调试版本.
#ifdef new
#undef new
#endif
#define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#ifdef malloc
#undef malloc
#endif
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#undef new
#endif
#define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#ifdef malloc
#undef malloc
#endif
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)