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

C++ Visual Studio 2010 C++;:获取malloc分配的内存块大小,c++,windows,visual-studio,memory-management,C++,Windows,Visual Studio,Memory Management,给定一个指向分配了malloc的内存块的指针,如何获取它的大小 例如: void* ptr = malloc( 10 ); //Allocate 10 bytes printf( "%d", GetMemSize( ptr ) ); //Should print 10 我想这样做是为了调试。如果您知道它的实现方式,因为它是特定于实现的,那么您只能获得大小。我必须跟踪内存,必须像中一样编写自己的包装。正如David Heffernan所说,你必须记住在VisualC++中我必须在包装器< /P>

给定一个指向分配了malloc的内存块的指针,如何获取它的大小

例如:

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

我想这样做是为了调试。

如果您知道它的实现方式,因为它是特定于实现的,那么您只能获得大小。我必须跟踪内存,必须像中一样编写自己的包装。正如David Heffernan所说,你必须记住在VisualC++中我必须在包装器< /P> > P>中使用的大小。< /P> < P>微软CRT有一个函数:代码> siZeSt*Msig(无效*内存块);代码>将为您提供所分配块的大小。注意,由于堆管理器管理内存的方式,这可能(事实上很可能)大于要求的大小

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

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

<> >强> Windows /VisualC++专用性:< /强>

附加数据存储在内存段中,位于
malloc
返回地址的数据之前

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

windowsnt:
unsignedlong-ulAllocSize=*((unsignedlong*)p-4)

windowsce:
unsignedlong-ulAllocSize=*((unsignedlong*)p-2)


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

我实际测试了这一点-当我
malloc()
10字节
\u msize()返回10字节时。