HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx的相关分析

一次做公司的一个项目,遇到这么个问题:写的DLL的工程需要被第三方EXE调用,编译成功后运行,过一会就出现弹框提示:Debug Error! HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx。如下图:

HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx的相关分析_第1张图片

我的工程生成的是debug版本的DLL,所以运行时会弹出这个提示框,告诉我内存哪里崩溃了。如果你生成的release版本的DLL,那么程序直接崩溃退出,不会有这个崩溃点提示框。

看这个提示框的提示信息,只写了崩溃的内存地址,并没有任何与源代码相关的提示,这就让人很崩溃,无法直接找到问题所在,只能一步步猜,一步步debug了。万幸的是,我看完可能会出错的代码后,找了这个问题所在,并把malloc的动态内存改写成一个大空间的数组pcRevBuffer[100],重新生成后,运行,崩溃并弹框提示,如下图:

HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx的相关分析_第2张图片

上图的崩溃信息包括崩溃的模块、崩溃相关的程序代码。

我之前malloc声明内存空间和这次的数组空间,都是通过传址给EXE程序来使用的,EXE程序会向里面写入数据,而正是EXE的写入越界导致崩溃。不同的是,malloc开辟的内存写越界和数组写越界,崩溃后的提示内容不一样。

这是因为数组的内存空间边界是明确的,与数组名称是绑定的,RUN-Time很清楚这块空间的范围是哪里到哪里;而malloc的空间,是动态开辟的,只有程序自己知道内存范围是多少,RUN-Time不清楚,它只能识别你写溢出的数据会不会影响程序的正常运行,崩溃的地址是多少,而你程序中有哪些指针指向这块空间就不知道了,更无法提示出这些指针名称。

你可能感兴趣的:(Visual,Studio环境下C语言编程)