动态内存分配———越界访问
在编写关于内存动态分配的程序时,很容易遇到越界访问的问题,如果是在visual studio环境下,一般会报 HEAP CORRUPTION DETECTED 错误。堆栈的越界访问又分为两种:堆前和堆后的越界访问。堆前的越界访问比较少见,VS2010弹出的报错信息为:
HEAP CORRUPTION DETECTED:after Normal block(#***) at 0x****.
CRT detected that application wrote memory before start of heap buffer.
当遇到这种错误时,上面的信息把出错的原因说得很清楚了:就是在分配的堆缓冲区之前写入了数据。可以利用单步调试定位到引起该错误的具体代码段,看是不是变量在运行时有小于0的状态。看如下代码:
char* docLex; docLex=(char*)malloc(len+1); memset(docLex,0,len+1); ...... //省略若干代码 while(j>=0&&docLex[j]!=' ') { j--; } ...... free(docLex); //代码运行到此处报错
仔细分析while循环可知当j=0并且docLex[j]!=' '时,j--语句执行之后j=-1,超过了docLex数组最小临界下标0,访问了分配空间以外的数据,如果调用free()函数释放空间的时候,系统会会先做内存检测,如果越界访问了就会产生崩溃终止程序运行。
同样的,如果程序访问了超过数组最大临界下标的数据,就会产生堆后的越界访问问题,原理是一样的,解决问题的方法还是要定位到你的数组下标自增语句,看是否增大到超过你的数组长度。