_CrtSetAllocHook笔记

本文介绍了一个自定义的内存分配挂钩函数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__)

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值