申請陣列記憶體空間時做了哪些事情
申請陣列時,除了分配申請的空間之外,還會分配一些空間儲存和這塊記憶體相關的資訊
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部分構成:頭、申請的空間、尾。
這樣我們申請的空間就被包在了中間,在釋放空間時,首先會根據頭尾兩部分來判斷是否越界。
釋放時,會將頭尾的空間一起釋放掉。