C++ vector<int>向量越界。。。运行段错误退出但gdb未定义到错误位置

来源:互联网 发布:caffe googlenet 分类 编辑:程序博客网 时间:2024/06/05 06:24

又是一段辛酸史,又是自己的粗心。。。(大哭中)

1、问题描述

处理一个图像分类问题,本来只是简单得统计下测试集的查准和查全,由于不停在调整分类大小,所以首先使用宏定义类的大小为NUMCLASS:

#define NUMClASS 54 
然后,声明vector<int>向量时初始化了其大小如下:

vector<int> numLabels(NUMClASS, 0);vector<int> numAccuracy(NUMClASS, 0);vector<int> numAllDetect(NUMClASS, 0);


其中,numLabels存储样本每类groundTruth标签;numAccuracy存储样本每类识别准确个数;numAllDetect存储样本每类识别总个数;


其次,在while循环测试单张样本中,定义了统计查准和查全的函数:

while(fgets(buff, 2000 ,fpListFile) != NULL){getImageIDAndLabel(buff, loadImgPath, label);//loadImgPath为测试图片存储路径;label为测试图片groundTrouth标签IplImage *img = cvLoadImage(loadImgPath);//读取图片if(!img || img->nChannels!=3 || img->depth!=IPL_DEPTH_8U) {cout<<"Can't open " << loadImgPath << endl;cvReleaseImage(&img);img = 0;continue;}predict(img, Res_clothRecognition); //识别,Res_clothRecognition存储识别结果resultStatic(label, Res_clothRecognition,  numLabels, numAccuracy, numThreshDetect, numAllDetect);//统计结果}



其中,predict()为识别分类接口;resultStatic()为统计识别结果接口;


2、问题原因

在我又一次调整了类别个数时,忘记修改NUMCLASS 的值,也就是说,我实际进行预测的那一批数据中,有label是大于54的,所以在resultStatic()函数中,直接给numLabels[label]中大于其size的index赋值,是违法的!!!

但是,我使用gdb调试程序运行产生的core文件时,bug定位的位置为while()那行!!!也有memory violation提示,但根本没找到位置,又因为vin界面用的太不熟悉,一直没注意到我最初的宏定义位置,直到将cpp文件在Source Insight中打开,我才一眼注意到了define!!!

好桑心,一直排斥用vim,总觉得不够直观。四个小时就这么过去了,深深地为我的程序生涯感到担忧。。。

0 0
原创粉丝点击