可以参考这篇文章:http://www.zengl.com/html/genlanmu/zenglbianchengyuyan/article-46.html
里面有一段详细说明了这个错误可能出现的原因,和可以用于调试的方法:
上面当AddNodeChild函数的child参数为-1时如果没有if(child >= 0 && child <= AST_nodes.count-1)做判断,那么nodes[child].parentnode = parent;就会写入到nodes数组的-1索引的位置,nodes是在堆中动态分配的内存块,也就是会写入到内存块之前的位置,这样就发生了向后溢出,在写入时并不会中断,所以比较难找。 当然对于这样的BUG可以使用gflags.exe工具进行调试,这个工具是Debug tools for windows工具集中的一部分,我将它也放在百度盘中,下载地址为:http://pan.baidu.com/share/link?shareid=224174&uk=940392313 ,下载后安装该程序,该程序会再从网上下载完整版的安装程序然后自动安装,在完整版的安装目录中就有gflags.exe工具,下面介绍下该工具如何查找堆溢出BUG:
在cmd下cd进入安装目录,然后输入 gflags.exe /p /enable xxxx.exe /full 这样就可以对xxxx.exe进行向前堆栈溢出的检查,如定义了一个数组int test[10]={0};如果test[12]=0; 这时visual studio就会立刻在这个位置中断并提示内存写入异常,因为test数组只有10个元素,但test[12]却访问到第13个元素,所以属于内存溢出, 如果要检查向后溢出,就需要使用gflags.exe /p /enable xxxx.exe /full /backwards命 令,多了个/backwards参数,如刚才的int test[10]={0};如果此时有段代码是test[-1]=0;那么visual studio就会在此中断。注意:向前溢出检查不可以同时检查向后溢出,所以你需要执行两次,一个向前溢出检查,一个向后溢出检查,才能判断你的程序是否 完全没有溢出,在使用gflags工具时,笔者就犯了这个错误没使用/backwards参数,所以就没检查出向后溢出的BUG。 如果没有gflags进行设置,那么就无法在写入溢出时中断,就只有在其他的malloc,free,realloc之类的函数中才会检测到。