windows已在xxx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug。
原因也可能是用户在xx.exe具有焦点时按下了F12。
输出窗口可能提供了更多诊断信息 。
当碰到此种错误的时候,基本上是因为我们在编写程序的时候,在处理数组或者指针的时候出现了越界(最可能)或者超长
的情况,从而导致了对栈堆的损坏。
我自己的程序就是因为一个很隐藏的变量没有置零造成的,在每次重用cor空间时,correlation记得置为0了,而cor_index却没有set 为 0.
因而随着多次重用,cor_index的值越来越大,从而在访问cor[cor_index]时出现严重越界.作这些设置,都跟add_correlation方法的实现有关,
里面如何使用correlation以及cor_index直接导致了在重复调用这个函数时必须重置cor[].correlation=0,cor_index=0.
当然造成这个错误很难查找的原因,编程习惯有点关系。在设计算法时,没有更多的考虑复用的简单性,过多的设置了一些全局变量,同时设计的
算法也不具一般性。这些以后都要注意改进。这个问题困扰了整整两天,一开始是在linux系统下编程实现的,由于linux下的调试环境不是特别熟悉,
也不是很直观,我调试了一天都没发现问题所在,只要在释放内存空间的地方,注释掉这些内存释放语句,程序就还能运行一下,但是我始终觉得这些
地方的内存释放是绝对没问题,但是为什么加上这些语句之后反而运行不了几步呢?我困惑了,我开始怀疑自己对内存管理的知识了。因此我将所有的
会让程序报错的内存释放语句都注释了。这时,当数据量不大的时候,程序正确执行;但是当数据量再大点的时候,就直接卡死了或者是说某地方越界
了。这种结果让我开始怀疑gsl_matrix库是不是有问题,因此我就将gsl_matrix全部用自己得矩阵库替换,还是发现有错误。
因此我确定了,是程序的其他地方出问题了。为了快速找出错误,我又重新改写了程序,将程序搬到了windows平台上,通过调试发现了这个错误。
再静过心,查看的时候,发现是cor_index的重置问题。
对一个程序员来说,不可以说自己的程序完全没有错误,很多时候一些错误都是你没发现而已,一般的情况这些错误并不表现出来,当它表现出来的
时候,也许已经是致命的错误了。对自己已有东西掌握我们也应该去怀疑,因为我们不一定完全理解正确了,也许有我们没有考虑到的。在使用别人的库
的时候,如果有问题,我们也许也更多地去考虑自己的问题。总之,编程需要耐心,需要不断地去实践,需要我们不停地去学习。