【发布时间】:2011-06-24 17:35:43
【问题描述】:
如果给定一个指向使用 malloc 分配的内存块的指针,我如何获得它的大小?
例如:
void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10
我想这样做是为了调试。
【问题讨论】:
标签: c++ windows visual-studio memory-management
如果给定一个指向使用 malloc 分配的内存块的指针,我如何获得它的大小?
例如:
void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10
我想这样做是为了调试。
【问题讨论】:
标签: c++ windows visual-studio memory-management
在 Visual C++ 中,您可以使用 _msize()。
【讨论】:
没有通用(标准化)方法来执行此操作,因为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。
【讨论】:
Microsoft CRT 有一个函数size_t _msize(void *memblock);,它将为您提供分配块的大小。请注意,由于堆管理器管理内存的方式,这可能(实际上很可能)大于要求的大小。
如其他答案所述,这是特定于实现的。
【讨论】:
malloc() 10 bytes _msize() 返回 10。
如果您知道它的实现方式,那么您只能获得尺寸,因为它是特定于实现的。我必须跟踪内存并且必须编写自己的包装器,如this question。所以正如大卫赫弗南所说,你必须记住我在包装纸中必须做的尺寸
【讨论】: