动态内存分配———越界访问

  在编写关于内存动态分配的程序时,很容易遇到越界访问的问题,如果是在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()函数释放空间的时候,系统会会先做内存检测,如果越界访问了就会产生崩溃终止程序运行。

  同样的,如果程序访问了超过数组最大临界下标的数据,就会产生堆后的越界访问问题,原理是一样的,解决问题的方法还是要定位到你的数组下标自增语句,看是否增大到超过你的数组长度。

 

 

 

posted on 2013-12-19 17:38  chenkeyou  阅读(461)  评论(0编辑  收藏  举报

导航