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

How to retrieve bytes being freed when using Allocator hooks?

我正在尝试在我的应用程序中实现一个基本的内存分析器(是的,我知道存在强大的外部软件)。我一直在研究一些关于如何使用分配挂钩的在线示例,并且我得到了计算内存分配的部分。它只是关于使用 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总是等于0。这意味着我们无法存储在 malloc 挂钩中释放的字节数。

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

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

减少 pvData 以到达 header 的开头并从 header 结构中获取插槽 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?

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

的简单解决方案