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错误。
解决方案:当申请堆内存空间的时候,申请的空间大小一定要大于等于实际上使用的内存空间大小。