struct _CrtMemBlockHeader
它存放了你申请的内存块信息,而这个结构体就存放在malloc所申请 返回的指针上面。
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader *pBlockHeaderNext;//下一个结构体指针
struct _CrtMemBlockHeader *pBlockHeaderPrev;//上一个结构体指针
char *szFileName;//szFileName是存储的发起分配操作的那行代码所在的文件的路径和名称
int nLine;//代码行号
size_t nDataSize;//请求分配的大小(字节)
int nBlockUse;//块类型。其中,1是自己调用、2为库函数调用、0为未调用。
long lRequest; //堆申请次数
unsigned char gap[nNoMansLandSize]; //溢出标志。其中,nNoMansLandSize = 4
} _CrtMemBlockHeader;
//在VS08 32位环境下
int *p = (int *)malloc(sizeof(int));
32字节的_CrtMemBlockHeader
+
4字节的申请空间
+
4字节的 unsigned char gap[nNoMansLandSize];//溢出标志
注意:两个溢出标志一旦有一个被修改,那么free释放空间时代码崩溃
int main()
{
int *p = (int *)malloc(sizeof(int));
/*
*(p+1) = 1;
free(p);
*/崩溃
*(p-1) = 1;
free(p);//依旧崩溃
return 0;
}


在Debug版本下, 申请的堆的可使用空间是用 ”CD” 符号填充的, “FD” 符号来防止越界, 在释放之后会使用 “EEFE” 符号来表示该区域是没有使用的区域。
本文详细解析了Visual Studio中内存管理的内部机制,重点介绍了_CrtMemBlockHeader结构体的作用和布局,阐述了其在malloc和free函数中如何确保内存安全,以及Debug模式下堆空间的特殊标记。
961

被折叠的 条评论
为什么被折叠?



