版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28110727/article/details/84329270
//释放空间是只需要执行断链操作,当某个堆空间被释放后,再次申请堆空间时会检查这个被释放的堆空间能够满足的用户要求.
如果能满足,则再次申请的堆空间的地址将会是刚释放过的堆空间地址
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 首地址