<>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[]的作用,你所申请的空间中的内容我们假定为<tdata>。在<tdata>的前后各有4个B(字节)的gap[],他在内存中的值为0xFD
。这样系统只需要检测你的<tdata>前后的数据是否为0xFD就可知道你有没有越界。

在实际的测试中,我们申请创建一个int类型的p指针,把内存的显示改为4列16进制(以下图片来自vs2019的debug模式)

我们可以看到,0x00FC05A0是我们的p指针所指向的内容,因为我们并没有创建内容所以在内存中使用0xcd进行填充,前后各有4B的0xfd来进行限定。

<>如何检测内存泄漏

上面我们知道了gap[]以及他的作用,那么我们顺利成章地就会想到_CrtDumpMemoryLeaks()这个函数,他就是通过检查内存分配链表(
pBlockHeaderNext和pBlockHeaderPrev为双链表的双链), 来查找是否有泄漏。

技术
©2019-2020 Toolsou All rights reserved,
python中delete怎么用_python中如何使用np.delete()方法?大厂Java岗春招必看:论一个面渣逆袭之路上必学得那些知识点3 4j不是合法的python表达式_3+4j不是合法的Python表达式。SQL综合题 员工单位综合题pyqt按钮调用python程序_PyQt:链接按钮到程序中的函数找出游戏的获胜者(java)看完这个去面试,稳过~~将硬盘转换成GPT分区格式python常用内置函数C语言(猜数字小游戏)