作者:zf19921020
* 转载请注明出处 *
从报错的基本情况来看是说定义的矢量vector下标超限了,而经过搜索和自己的探究,报这种错的可能性有以下几种。
1、某个vector进行了违规下标访问,即在vector没有初始化时就利用[]操作符对vector进行访问,在这里说明,vector的推荐访问方式是利用vector::iterator进行访问或者利用vector.at方法进行访问。利用下标进行访问之前必须确保下标所表示的vector的位置是存在的,因为编译器不会为你检查这种错误而只能是程序员自己在Code时进行检查。
2、在函数或者某作用域中定义了指向vector的指针而没有手动删除也有可能会报这种错,因为内存没有被释放,所以可能会产生这种错误,这里推荐指针的定义和使用利用智能指针来完成,即shared_ptr,这是C++11的新特性,能自动管理和释放指向对象的指针。shared_ptr定义在memory头文件中。
3、最后一种报错情况比较特殊,利用vs2013+opencv进行人脸和人眼识别时,如果确认vector没有超限,也没用指针没释放的情况但是单步调试发现在离开某些函数的作用于就报vector subscript out of range 这种错误或者_CRTISVALIDHEAP之类的错误,有可能是你的VS13版本链接到了10版的VS的opencv的库。我们可以通过在Solutiong->Properties->Configuration Properties->VC++ Directorys->Library Directorys中查看,如果opencv的链接库的地址中包含了vc10,则代表链接的是vs2010的版本库,vs12代表vs2013及以上版本。