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

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

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,总觉得不够直观。四个小时就这么过去了,深深地为我的程序生涯感到担忧。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bicelove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值