vs如何對堆空間進行管理
阿新 • • 發佈:2018-11-23
//釋放空間是隻需要執行斷鏈操作,當某個堆空間被釋放後,再次申請堆空間時會檢查這個被釋放的堆空間能夠滿足的使用者要求. 如果能滿足,則再次申請的堆空間的地址將會是剛釋放過的堆空間地址 typdef struct _CrtMemBlockHeader { struct _CrtMemBlockHeader *pBlockHeaderNext; //下一塊堆空間首地址(指向的是前一次申請的記憶體資訊) struct _CrtMemBlockHeader *pBlockHeaderPre; //上一塊堆空間首地址(指向的是後一次申請的記憶體資訊) char *szFileName; int nLine; size_t nDataSize; //堆空間資料大小 int nBlockSize; long lRequest; //堆申請的次數 unsigned char gap[nNoMansLandSize]; //堆空間資料 }_CrtMemBlockHeader; char *p1 = (char*)malloc(10); 0x0141BAD8 ab ab ab ab ???? 0x0141BADC ab ab ab ab ???? 0x0141BAE0 00 00 00 00 .... 0x0141BAE4 00 00 00 00 .... 0x0141BAE8 b9 c5 9b 15 ???. 0x0141BAEC 15 f5 00 1a .?.. //下一個堆空間的地址 0x0141BAF0 58 64 41 01 XdA. //上一個堆空間的地址 0x0141BAF4 00 00 00 00 .... 0x0141BAF8 00 00 00 00 .... 0x0141BAFC 00 00 00 00 .... 0x0141BB00 0a 00 00 00 .... //堆資料的容量 0x0141BB04 01 00 00 00 .... 0x0141BB08 49 00 00 00 I... //此空間第幾次申請 0x0141BB0C fd fd fd fd ???? //越界標誌 fdfdfdfd 0x0141BB10 cd cd cd cd ???? //malloc 首地址