HEAP CORRUPTION DETECTED:after Normal block错误方法解决
一:问题描述:
出现的问题如下:
二:问题产生的原因说明
该问题发生于操作堆内存的时候。产生该问题的原因是:你实际使用的内存大小超出了你实际申请的内存大小,在释放内存的时候就会发生该问题。
举个例子:假如你申请了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错误方法解决的更多相关文章
- HEAP CORRUPTION DETECTED :after Normal block 错误
http://blog.csdn.net/zhccl/article/details/7889590
- heap corruption detected错误解决方法调试方法以及内存管理相关
1.heap corruption detected http://vopit.blog.51cto.com/2400931/645980 heap corruption detected:aft ...
- 内存溢出(heap corruption detected:)
今天又遇到了上次出现的bug,然后百度了一下,想起来这是内存溢出的毛病,故记录下来! 出现的问题就是这样: heap corruption detected: after normal block(# ...
- C语言错误: HEAP CORRUPTION DETECTED
程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<std ...
- VC++ 报错:Heap corruption detected
今天在写代码时,发现莫名其妙的错误: std::string strName = L“testtest”; char* pOutString = new char(len + 1); Decrypt( ...
- [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 ...
- python中IndentationError: expected an indented block错误的解决方法
IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进
- HEAP CORRUPTION DETECTED
发生主要是由于这个问题给写入超出预分配的空间,注意检查越界情况 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- heap corruption detected VS2015 C语言 报错
申请动态内存时,申请的单元数为n,可用下标为0~n-1 但实际使用时超过了该范围,就会报这个错
随机推荐
- VS2017报错:未识别符vector
解决办法:添加头文件#include<vector>,添加命名空间 using namespace std.
- 福利来了~Linux一键部署包,环境安装不用愁!!!
前言 昨天一哥们的弟弟突然问我有没有部署过的Linux,公司连个运维都没有,服务器都要后端部署.... 你有没有相似的遭遇呢?公司规模小,后端即是运维,一份工资干两份活,哈哈~ 为了解决这老弟的困惑, ...
- python中库引用与import
在蟒蛇绘制函数中,多有turtle. ,称它为<a>.<b>的编码风格 库引用 扩充python程序功能的方式 使用import保留字完成,采用<a>.< ...
- netty之handler read
有时候会有一系列的处理in的handler,使用fireChannelRead处理传递 转载自https://blog.csdn.net/u011702633/article/details/8205 ...
- 《Head First 设计模式》:状态模式
正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...
- NIO 实现简单群聊功能
服务端: package com.yang.runnable; import java.io.IOException; import java.net.InetSocketAddress; impor ...
- 剑指offer-字符串&数字规律
1. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123",&q ...
- SPI应用 用SPI控制一个数字电位器
Controlling a Digital Potentiometer Using SPI In this tutorial you will learn how to control the AD5 ...
- MATLAB textread函数
实际应用中经常要读取txt文件,这个时候就需要用到强大的textread函数.它的基本语法是:[A,B,C,...] = textread(filename,format)[A,B,C,...] = ...
- 【题解】[ZJOI2009]狼和羊的故事
题目戳我 \(\text{Solution:}\) 显然思路,把所有羊看成一个源点,所有狼看成一个汇点,格子之间连容量为\(1\)的边,直接跑最小割. 技巧: 注意到篱笆不能把羊给割掉,狼同理.所以, ...