Windows里malloc时,操作系统分配内存时会在分配的内存前面多分配20个字节,其中前16个字节用于内存管理时使用,后4个字节用于标识内存边界。分配空间后面也会有4个字节用于标识边界。
如malloc分配一个n字节的空间,实际的内存为
返回的指针指向如下内存段的首地址
↓
|16个字节的内存管理信息|4字节边界|n字节的空间|4字节边界|
↑
这里的第5个字节到第8字节是一个4字节整形,记录着内存空间的大小
这也就解释了为什么我们可以malloc一个0字节的空间,也能正常返回指针。
//申请了一个内存段
char* p = (char*)malloc(n);
//将p传入如下函数能返回内存段的大小
size_t getMemSize(char* pHeapAddr)
{
#ifdef _WIN32
return *(int*)(pHeapAddr - 16);
#else
return 0;
#endif
}