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
- C++ vector<int>向量越界。。。运行段错误退出但gdb未定义到错误位置
- C“段错误” : 快速定位“段错误”位置
- 段错误 gdb调试
- gdb 调试段错误
- gdb段错误
- gdb 调试 段错误
- GDB 调试段错误
- GDB 调试段错误
- gdb调试段错误
- gdb查找段错误
- gdb调试段错误
- gdb调试,分析core文件,找出段错误位置
- 通过gdb快速定位“段错误”的位置
- 通过GDB快速定位“段错误”的位置
- 解决Linux c语言运行时候“段错误 (核心已转储)”问题-采用gdb 解决
- vector sort 段错误。
- gcc编译通过,但运行程序出现段错误
- 数组越界会产生段错误
- rhel7.2 安装oracle11g
- redis WRONGTYPE Operation against a key holding the wrong kind of value
- 记录开机自启日报系统
- Linux权限详解:用户、用户组及文件权限
- Rx 入门(五)-- 转换操作符
- C++ vector<int>向量越界。。。运行段错误退出但gdb未定义到错误位置
- 16.Java 基础
- Linux
- Windows10 Java环境变量配置
- 矩阵乘法 nyoj 623
- POJ 3083(按规定方法遍历)
- 硬件编解码(一)硬件编解码介绍
- 获取高德地图api key
- Unity编程笔录-wikitude简单介绍和使用Android Studio打包apk