Visual Studio 2010 C ++:获取malloc分配的内存块大小

时间:2011-02-10 09:38:41

标签: c++ windows visual-studio memory-management

如果指向一个用malloc分配的内存块的指针,它的大小是什么?

例如:

void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10

我想这样做是为了调试目的。

4 个答案:

答案 0 :(得分:7)

在Visual C ++中,您可以使用_msize()

答案 1 :(得分:3)

Microsoft CRT有一个函数size_t _msize(void *memblock);,它将为您提供已分配块的大小。请注意,由于堆管理器管理内存的方式,这可能(实际上可能是)大于所要求的大小。

这是特定于实现的,如其他答案中所述。

答案 2 :(得分:0)

如果你知道它的实现方式,你只能获得大小,因为它是特定于实现的。我必须跟踪内存并且必须像this question那样编写自己的包装器。正如David Heffernan所说,你必须记住我在包装中必须做的大小

答案 3 :(得分:0)

由于malloc的实现是特定于系统和体系结构,因此没有通用(标准化)方法。唯一保证的行为是malloc(N)将返回至少N个字节或NULL。 malloc总是分配比询问更多的内存 - 存储要求的大小(N),通常还有一些额外的簿记数据。

特定于Windows / Visual C ++:

malloc返回地址之前,其他数据存储在内存段中。

如果p = malloc(N)p != 0如果只知道p,您可以使用以下代码来确定要求的内存大小:

Windows NT:unsigned long ulAllocSize = *((unsigned long*)p - 4);

Windows CE:unsigned long ulAllocSize = *((unsigned long*)p - 2);

请注意ulAllocSize不是用malloc分配的整个块的大小,而只是作为参数传递的值 - N