一:问题描述:

出现的问题如下:

二:问题产生的原因说明

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

举个例子:假如你申请了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. Kvm 虚拟化介绍(1)

    一.虚拟化分类       1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间 ...

  2. 给你的MyBatis-Plus装上批量插入的翅膀

    努力和选择,哪个更重要?关注微信公众号[天开易想]这是一位懂互联网研发和架构的户外.篮球老铁 前言 各位好,我是易哥(thinkYi). 大家有用过MyBatis-Plus(简称MP)的都知道它是一个 ...

  3. [LCTF]bestphp's revenge 给我的启发学习

    bestphp's revenge flag.php: only localhost can get flag!sessionstart(); echo 'only localhost can get ...

  4. python类中的__init__和__new__方法

    Python中类: Python中在创建类的过程中最先调用的不是__init__方法而是__new__方法,__new__方法是一个静态方法,在创建一个类对象时其实是通过__new__方法首先创建出一 ...

  5. 坚果云+svn实现异地非局域网个人代码版本管理

    原理大概是A地的设备作为服务端创建仓库,将仓库传上坚果云,同步到B地,再拉取仓库的代码

  6. 关于人人开源renren-fast-vue 中npm install各种报错的解决方案

    首先吐槽一下,因为这个问题我整了好几天,把报错信息复制百度,试遍了各种方法,node.js我是卸载了安装,安装了卸载,甚至renren-fast-vue我也删了再下,然后再删,无限循环.然而没有什么软 ...

  7. Mac OS X中Apache开启ssl

    升级ios7.1之后用那个企业证书打测试包网页上不能下载,提示Mainfest.plist需要用https,然后就看了下Apache的https的设置,虽然后来还是不行,先略下不表,下文再说,把这个过 ...

  8. Python-禅

    Python特点 1. 面向对象解释性编程语言 2. 简洁.优雅的编码风格 3. 跨平台 windows MacOS Linux 4. 丰富的标准库和第三方库 什么是编程? 解决现实中问题 什么是面向 ...

  9. 使用模拟退火算法优化 Hash 函数

    背景 现有个处理股票行情消息的系统,其架构如下: 由于数据量巨大,系统中启动了 15 个线程来消费行情消息.消息分配的策略较为简单:对 symbol 的 hashCode 取模,将消息分配给其中一个线 ...

  10. windbg分析dump-解决mscorwks不匹配

    目录 前言 什么是mscorwks 什么是SOS 什么是mscordacwks 上述错误是什么意思? 什么时候会出现该错误 如何修复错误 符号文件目录规则 相关资料 前言 在使用.net的生产环境时, ...