1. 程式人生 > >申請陣列記憶體空間時做了哪些事情

申請陣列記憶體空間時做了哪些事情

申請陣列時,除了分配申請的空間之外,還會分配一些空間儲存和這塊記憶體相關的資訊

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部分構成:頭、申請的空間、尾。
這樣我們申請的空間就被包在了中間,在釋放空間時,首先會根據頭尾兩部分來判斷是否越界。
釋放時,會將頭尾的空間一起釋放掉。