_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;
}

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__)

 

转载于:https://www.cnblogs.com/fangkm/archive/2009/07/03/1516138.html

你可能感兴趣的:(_CrtSetAllocHook笔记)