zoukankan      html  css  js  c++  java
  • _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__)
  • 相关阅读:
    HDU-1527 取石子游戏
    HDU-1846 Brave Game
    HDU-1850 Being a Good Boy in Spring Festival
    HDU-2509 Be the Winner
    HDU-1907 John
    HDU-1969 Pie
    HDU-1501 Zipper
    HDU-2289 Cup
    最大子矩阵和
    HDU3466(01背包变种)
  • 原文地址:https://www.cnblogs.com/fangkm/p/1516138.html
Copyright © 2011-2022 走看看