诡异难解决的错误:Windows已在中触发⼀个断点windows已在中触发⼀个断点,其原因可能是堆被损坏,这说明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的重置问题。
对⼀个程序员来说,不可以说⾃⼰的程序完全没有错误,很多时候⼀些错误都是你没发现⽽已,⼀般的情况这些错误并不表现出来,当它表现出来的时候,也许已经是致命的错误了。对⾃⼰已有东西掌
握我们也应该去怀疑,因为我们不⼀定完全理解正确了,也许有我们没有考虑到的。在使⽤别⼈的库的时候,如果有问题,我们也许也更多地去考虑⾃⼰的问题。总之,编程需要耐⼼,需要不断地去实践,需要我们不停地去学习。