<>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,
Django个人博客搭建教程---时间分类归档你不知道的鸿蒙——HarmonyOS记录一次游戏私服getshell过程mysql联合索引详解百度网盘偷偷更新,终于实现免费不限速了! 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享uniapp页面传值总结Android中获取当前正在显示的Activity实例SQL Server 数据库词汇表Python垃圾回收与内存泄露