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



我正在尝试在我的应用程序中实现一个基本的内存分析器(是的,我知道存在强大的外部软件)。我一直在研究一些如何使用分配钩子的在线示例,并且我得到了计数内存分配的部分。这只是关于安装一个带有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 钩子中释放的字节量。

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

在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):

除了查找可重现的内存泄漏之外,我可以使用可视C++调试 CRT 分配挂钩执行哪些有用的操作?

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

相关内容

  • 没有找到相关文章

最新更新