C++内存 指针越界检测机制_CrtMemBlockHeader

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为双链表的双链), 来查找是否有泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值