使用分配器挂钩时如何检索被释放的字节?
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):
尽管我更喜欢@Angela Richardson 对我的问题的回答,因为它指出了在 Visual Studio 中提供的更灵活的解决方案,通过使用 _CrtMemBlockHeader
,我认为它也值得注册这里 Visual Studio 也允许使用 _msize(void* ptr)
的简单解决方案
我正在尝试在我的应用程序中实现一个基本的内存分析器(是的,我知道存在强大的外部软件)。我一直在研究一些关于如何使用分配挂钩的在线示例,并且我得到了计算内存分配的部分。它只是关于使用 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):
尽管我更喜欢@Angela Richardson 对我的问题的回答,因为它指出了在 Visual Studio 中提供的更灵活的解决方案,通过使用 _CrtMemBlockHeader
,我认为它也值得注册这里 Visual Studio 也允许使用 _msize(void* ptr)