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