_CrtSetAllocHook笔记

每次分配、重新分配或释放内存时都会调用分配挂钩函数,这个挂钩函数可以通过_CrtSetAllocHook函数来设置.如:_CrtSetAllocHook( MyAllocHook );

MyAllocHook的定义如下:

/* 
* 自定义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__)

 

posted @ 2009-07-03 11:25  孤竹君  阅读(1789)  评论(1编辑  收藏  举报