使用Allocator挂钩时如何检索被释放的字节?

时间:2017-03-18 05:05:12

标签: c++ memory-management malloc profiling hook

我正在尝试在我的应用程序中实现一个基本的内存分析器(是的,我知道强大的外部软件的存在)。我一直在研究如何使用分配挂钩的一些在线示例,我得到了计算内存分配的部分工作。它只是安装一个带CtrSetAllocHook的自定义malloc,它看起来或多或少如下:

int64_t memUsage (0);
int __cdecl MyAllocHook(
    int      nAllocType,
    void   * pvData,
    size_t   nSize,
    int      nBlockUse,
    long     lRequest,
    const unsigned char * szFileName,
    int      nLine
)
{
    if (nAllocType ==_HOOK_ALLOC)
    {
        memUsage += nSize;
    }
    else if (nAllocType == _HOOK_FREE)
    {
    //HOW-TO: memUsage -= nSize; ???
    }

    return(TRUE);
}

然而,当分配内存时,很容易增加一个计数器int变量来检索从nSize分配的内容的大小,我不知道如何减少这样的内容释放内存时的计数器。原因是当调用malloc释放内存(即nAllocType参数= _HOOK_FREE_)时,上述函数的参数nSize总是等于零。这意味着我们无法存储malloc挂钩中释放的字节数。

有人可以帮我理解在免费内存模式下调用memUsage时如何使用分配挂钩来减少malloc计数器?

2 个答案:

答案 0 :(得分:1)

在Visual Studio 6.0和2008中的调试模式下(您使用的是哪个版本?),pvData指向的数据前面有一个_CrtMemBlockHeader结构,其中包含有关内存的信息。

递减pvData以获取头部的开头并从头部结构中获取槽nDataSize。

int MyAllocHook(..) 
{
    else if (nAllocType == _HOOK_FREE) 
    {
        size_t headerSize = sizeof(_CrtMemBlockHeader);
        _CrtMemBlockHeader* pHead;
         size_t ptr = (size_t) pvData - headerSize;
         pHeader = (_CrtMemBlockHeader*) (ptr);
         size_t dataSize = pHeader->nDataSize;
}

此外,请参阅此处的第二个答案(适用于visual studio 2008):

What useful things can I do with Visual C++ Debug CRT allocation hooks except finding reproduceable memory leaks?

答案 1 :(得分:0)

虽然我更喜欢@Angela Richardson对我的问题的回答,因为它指的是在Visual Studio中使用_CrtMemBlockHeader提供的更灵活的解决方案,我认为这也值得注册Visual Studio还允许使用_msize(void* ptr)

的简单解决方案