越界访问的一般提示是 “access violation reading location 0xXXXXXXXX”,翻译过来就是“内存越界访问”。
这个提示和一般提示的不同之处是,程序不会停在越界访问的错误行上,
而是会停在分配或释放内存的行上,于是就需要我们自己去找到越界行。
那要怎么找到越界行呢?这里说一个较为实际的办法:
首先根据 函数调用栈 (Call Stack) 这个工具,找到内存越界访问的那个函数。
例如:
f()
{
#define MAXLIM 100
#define MAXLEN 10
int *p = (int *)calloc(MAXLEN, sizeof(int));
int *q = (int *)calloc(MAXLIM, sizeof(int));
int i;
for(i = 0; i < MAXLIM; i++)
p[i] = 1;
free(q);
free(p); // 程序将在执行这一行后提示一个对话框,同时 Output 窗口中会输出一行 “access violation reading location 0xXXXXXXXX”
}
然后按照下述法则调试代码,保证可以找到内存越界访问:
1. 注释 (Comment) 大量连续源代码,只保留成对的 *alloc 和 free,运行看是否还提示越界。然后进行下一步。
2. 若越界访问ÿ