申请数组时,除了分配申请的空间之外,还会分配一些空间存储和这块内存相关的信息
1、_CrtMemBlockHeader,放在申请的内存空间之前,包括两部分:[1]这块内存的相关信息。[2]申请内存之前连续4个字节,值为fd
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
2、紧跟申请内存之后连续4个字节,值为fd。
由此可见,申请一个数组后,分配的连续空间由3部分构成:头、申请的空间、尾。
这样我们申请的空间就被包在了中间,在释放空间时,首先会根据头尾两部分来判断是否越界。
释放时,会将头尾的空间一起释放掉。