Visual Studio 2010 C++:获取 malloc 分配的内存块大小
Posted
技术标签:
【中文标题】Visual Studio 2010 C++:获取 malloc 分配的内存块大小【英文标题】:Visual Studio 2010 C++: Get size of memory block allocated by malloc 【发布时间】:2011-06-24 17:35:43 【问题描述】:如果给定一个指向使用 malloc 分配的内存块的指针,我如何获得它的大小?
例如:
void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10
我想这样做是为了调试。
【问题讨论】:
【参考方案1】:在 Visual C++ 中,您可以使用 _msize()
。
【讨论】:
【参考方案2】:没有通用(标准化)方法来执行此操作,因为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
。
【讨论】:
【参考方案3】:Microsoft CRT 有一个函数size_t _msize(void *memblock);
,它将为您提供分配块的大小。请注意,由于堆管理器管理内存的方式,这可能(实际上很可能)大于要求的大小。
如其他答案所述,这是特定于实现的。
【讨论】:
我实际测试过这个 - 当我malloc()
10 bytes _msize()
返回 10。【参考方案4】:
如果您知道它的实现方式,那么您只能获得尺寸,因为它是特定于实现的。我必须跟踪内存并且必须编写自己的包装器,如this question。所以正如大卫赫弗南所说,你必须记住我在包装纸中必须做的尺寸
【讨论】:
以上是关于Visual Studio 2010 C++:获取 malloc 分配的内存块大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2010 的 C++ googletest 项目中设置代码覆盖率
将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010
获取一个文件的名称方法 - 自定义界面 - Microsoft Visual Studio 2010 [关闭]