我正在尝试在我的应用程序中实现一个基本的内存分析器(是的,我知道强大的外部软件的存在)。我一直在研究如何使用分配挂钩的一些在线示例,我得到了计算内存分配的部分工作。它只是安装一个带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
计数器?
答案 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):
答案 1 :(得分:0)
虽然我更喜欢@Angela Richardson对我的问题的回答,因为它指的是在Visual Studio中使用_CrtMemBlockHeader
提供的更灵活的解决方案,我认为这也值得注册Visual Studio还允许使用_msize(void* ptr)