一:问题描述:

出现的问题如下:

二:问题产生的原因说明

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

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

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

strcpy(ptr, buf);// 拷贝函数默认会在末尾添加一个'\0'字符,在此处你仅仅申请了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拷贝时末尾默认会添加一个'\0'字符, 所以实际使用的内存空间为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错误。

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

HEAP CORRUPTION DETECTED:after Normal block错误方法解决的更多相关文章

  1. HEAP CORRUPTION DETECTED :after Normal block 错误

    http://blog.csdn.net/zhccl/article/details/7889590

  2. heap corruption detected错误解决方法调试方法以及内存管理相关

    1.heap corruption detected http://vopit.blog.51cto.com/2400931/645980   heap corruption detected:aft ...

  3. 内存溢出(heap corruption detected:)

    今天又遇到了上次出现的bug,然后百度了一下,想起来这是内存溢出的毛病,故记录下来! 出现的问题就是这样: heap corruption detected: after normal block(# ...

  4. C语言错误: HEAP CORRUPTION DETECTED

    程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<std ...

  5. VC++ 报错:Heap corruption detected

    今天在写代码时,发现莫名其妙的错误: std::string strName = L“testtest”; char* pOutString = new char(len + 1); Decrypt( ...

  6. [linux系统]XFS (vda3):Corruption detected.Unmount and run xfs_repair 简单解决办法

    今天kvm的centos系统,rm -rf时报错,具体如下: rm: cannot remove ‘log-0/case1/log_net’: Input/output errorrm: cannot ...

  7. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

  8. HEAP CORRUPTION DETECTED

    发生主要是由于这个问题给写入超出预分配的空间,注意检查越界情况 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  9. heap corruption detected VS2015 C语言 报错

    申请动态内存时,申请的单元数为n,可用下标为0~n-1 但实际使用时超过了该范围,就会报这个错

随机推荐

  1. python中库引用与import

    在蟒蛇绘制函数中,多有turtle.   ,称它为<a>.<b>的编码风格 库引用 扩充python程序功能的方式 使用import保留字完成,采用<a>.< ...

  2. TX-LCN分布式事务框架使用

    官方文档相关: GitHub地址:https://github.com/codingapi/tx-lcn 官方文档:https://www.codingapi.com/docs/txlcn-prefa ...

  3. java基础之序列化

    转载自https://www.cnblogs.com/szlbm/p/5504166.html Java对象表示方式1:序列化.反序列化和transient关键字的作用   平时我们在Java内存中的 ...

  4. 1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!

    一.背景 1.各业务系统持续迭代过程中,JDK.SpringBoot.RocketMQ Client 等框架也进行了升级,高版本的 RocketMQ Client 发送的消息到低版本中,在控制台中午无 ...

  5. Unity3D 一、游戏

    3D游戏编程第一次作业 作业要求 阅读 Tracy Fullerton, *GAME DESIGN WORKSHOP* 第2-4章(游戏结构.基本元素.戏剧元素).选择一款你喜欢的中等规模游戏如&qu ...

  6. 求第k小的数

    题目链接:第k个数 题意:求n个数中第k小的数 题解: //由快速排序算法演变而来的快速选择算法 #include<iostream> using namespace std; const ...

  7. Redis中String类型的相关命令操作

    String append 如果key已存在,则直接在value追加值,如果key不存在,则会插件一个新的value为空的key,然后在追加 127.0.0.1:6379> set name l ...

  8. 《zookeeper原理与实践》笔记

    第1章 分布式架构 1.1 分布式 分布式特点:分布性.对等性.并发性.缺乏全局时钟.故障总是会发生. 分布式问题:通讯异常.网络分区(脑裂).三态.节点故障.   1.2 ACID到CAP/BASE ...

  9. IntelliJ IDEA 2020.2 x64 最新破解教程有效期到2089年 完全免费分享

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.com 个 ...

  10. IDEA 条件断点 进行debug调试

    1. 鼠标左键在要断点的行号点击一下,打个断点 2.鼠标移动到断点处,然后点击一下鼠标右键,之后会弹出: 3.填写条件,可以使用该行中的代码对应的变量作为条件 4.点击Done按钮 至此条件断点设置完 ...