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 [关闭]

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

visual studio2010 c++头文件怎么写

Visual Studio 2010:如何让代码“管理”[重复]