• HEAP CORRUPTION DETECTED:after Normal block错误方法解决


    一:问题描述:

    出现的问题如下:

    二:问题产生的原因说明

      该问题发生于操作堆内存的时候。产生该问题的原因是:你实际使用的内存大小超出了你实际申请的内存大小,在释放内存的时候就会发生该问题。

      举个例子:假如你申请了3个字节的堆内存空间     char *ptr = (char *)malloc(sizeof(char)*3);

                        但是你在使用的时候使用了4个字节,char *t1 = "abc";// 注意末尾有一个''字符

                                                                                   strcpy(ptr, buf);// 拷贝函数默认会在末尾添加一个''字符,在此处你仅仅申请了3个字节的空间,但你实际使用的空间为4个字节

                          在往ptr指向的3个字节的堆内存空间,写入超过一个字节的内容时, vs2010中的编译器并不会报错, 但是为后面的内存释放埋下个巨大的隐患。

                         此后当你在释放ptr指向的内存时,由于你使用了超过申请大小的内存空间,导致内存不能正确释放,就会发生上面的问题。

    三:举例

    有问题代码如下:

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <iostream>
     3 using namespace std;
     4 int main()
     5 {
     6     const char* t1 = "abc";
     7     cout << sizeof(t1) << endl; // 4
     8 
     9     // 申请内
    10     int memSize = 3;
    11     char* ptr = (char*)malloc(sizeof(char) * memSize);  // 仅仅申请了3个字节的堆内存空间
    12     // 初始化内存
    13     memset(ptr, 0, memSize);
    14     // 拷贝内容
    15     strcpy(ptr, t1);  // strcpy拷贝时末尾默认会添加一个''字符, 所以实际使用的内存空间为4个字节,超出了申请的内存空间大小,为后来的内存释放埋下了巨大的隐患
    16 
    17     cout << ptr << endl;
    18 
    19     if (ptr != NULL)
    20     {
    21         free(ptr);
    22         ptr = NULL;
    23     }
    24 
    25     system("pause");
    26     return 0;
    27 }

    上面的代码运行后就会出现下面的问题

    正确代码:

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <iostream>
     3 using namespace std;
     4 int main()
     5 {
     6     const char* t1 = "abc";
     7     cout << sizeof(t1) << endl; // 4
     8 
     9     // 申请内
    10     //int memSize = 3;// 申请内存的大小必须与实际使用的内存大小一致
    11     int memSize = 4;// 实际使用的内存大小为4个字节,那么申请内存必须大于等于实际使用的内存。
    12     char* ptr = (char*)malloc(sizeof(char) * memSize);  
    13     // 初始化内存
    14     memset(ptr, 0, memSize);
    15     // 拷贝内容
    16     strcpy(ptr, t1);  
    17 
    18     cout << ptr << endl;
    19 
    20     if (ptr != NULL)
    21     {
    22         free(ptr);
    23         ptr = NULL;
    24     }
    25 
    26     system("pause");
    27     return 0;
    28 }

    四:总结

    当实际使用的内存大小超过了申请内存空间大小时,在以后释放内存的时候就会引发HEAP CORRUPTION DETECTED:after Normal block错误。

    解决方案:当申请堆内存空间的时候,申请的空间大小一定要大于等于实际上使用的内存空间大小。

  • 相关阅读:
    【java】httpclient的使用之java代码内发送http请求
    【前台 ajax】前台ajax请求,地址正确,但是报错不进入后台
    【IntelliJ IDEA】idea上提交代码到GitHub,已经提交了 但是GitHub上却没有的解决办法
    【Jpa hibernate】一对多@OneToMany,多对一@ManyToOne的使用
    数据库SQL优化大总结之 百万级数据库优化方案
    mysql explain 的type解释
    多线程过滤敏感词
    H5实现的手机摇一摇
    nginx中文文档
    JS实现根据密码长度 显示安全条
  • 原文地址:https://www.cnblogs.com/qingpeng/p/13863270.html
Copyright © 2020-2023  润新知