C++调用构造函数传递变量时触发Segmentation fault问题求解
问题原因
- 段错误的核心触发原因是你构造完
Course对象后,没有调用readScores()方法填充成员变量vector<double> studentScores,此时studentScores是空向量。你后续调用的getMax()、getMin()方法如果是直接访问studentScores[0]这类下标元素,空向量的下标访问属于内存越界操作,会直接触发段错误。你用字面量参数测试时没有触发问题,是因为测试时你同步调用了readScores()或者手动给studentScores填充了数据。 - 你标注的段错误触发位置实际有偏差,给出的构造函数逻辑没有越界操作,段错误实际触发在
getMax()调用那行。 - 存在一个潜在输入异常问题:你用
std::cin >>读取数字(creditHrs、numOfStudents)后,输入缓冲区会残留一个换行符,后续如果调用std::getline读取内容,第一次getline会直接读到空字符串。 - 你从Java转C有个常见误区:C不是所有类对象都需要用
new创建,局部使用的对象可以直接在栈上分配,不需要手动管理内存,比Java的使用更灵活。
修复方案
- 构造完
Course对象后,先调用readScores()录入成绩,再调用统计方法:
Course *newCourse = new Course(courseCode, courseTitle, creditHrs, numOfStudents); newCourse->readScores(); // 新增此行,先填充成绩再做计算 double max = newCourse->getMax(); double average = newCourse->getAverage(); double min = newCourse->getMin();
- 清理输入流残留的换行符,避免后续输入异常,在所有
std::cin >>读取操作后添加缓冲区清理代码:
// 引入头文件 <limits> 后使用 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
- 建议优化对象创建方式,直接在栈上创建对象,避免内存泄漏:
// 不需要new,直接栈上创建,用完自动释放 Course newCourse(courseCode, courseTitle, creditHrs, numOfStudents); newCourse.readScores(); double max = newCourse.getMax(); // 后续调用方法统一用.而不是->
内容的提问来源于stack exchange,提问作者pcana
相关产品推荐
相关产品推荐

