c++内存 指针越界检测机制_CrtMemBlockHeader
c++的new和delete操作,可以让我们在程序运行中动态的开辟内存空间,但是我们知道,一旦处理不好就会造成内存泄漏。一直有一个疑问,c++为防止(或者说检测)指针越界做了哪些工作?
struct _CrtMemBlockHeader
_CrtMemBlockHeader :这个结构体,存放了动态申请得到的内存块的各种信息,并且返回到你的指针上面。具体内容如下:
typedef struct _CrtMemBlockHeader
{
// 指向下一块数据块的指针
struct _CrtMemBlockHeader *pBlockHeaderNext;
// 指向前一块数据块的指针
struct _CrtMemBlockHeader *pBlockHeaderPrev;
// File name:请求内存分配操作的那行代码所在的文件的路径和名称,但实际上是空指针
char *szFileName;
// Line number:行号,请求内存分配操作的那行代码的行号
int nLine;
// 请求分配的大小 size_t nDataSize;
// Type of block 类型
int nBlockUse;
// 请求号
long lRequest;
// 这个gap,正是cpp中对于指针的界限
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
我们来说一说gap[]的作用,你所申请的空间中的内容我们假定为。在的前后各有4个B(字节)的gap[],他在内存中的值为0xFD。这样系统只需要检测你的前后的数据是否为0xFD就可知道你有没有越界。
在实际的测试中,我们申请创建一个int类型的p指针,把内存的显示改为4列16进制(以下图片来自vs2019的debug模式)
我们可以看到,0x00FC05A0是我们的p指针所指向的内容,因为我们并没有创建内容所以在内存中使用0xcd进行填充,前后各有4B的0xfd来进行限定。
如何检测内存泄漏
上面我们知道了gap[]以及他的作用,那么我们顺利成章地就会想到_CrtDumpMemoryLeaks()这个函数,他就是通过检查内存分配链表(pBlockHeaderNext和pBlockHeaderPrev为双链表的双链), 来查找是否有泄漏。