You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的使用更灵活。
修复方案
  1. 构造完Course对象后,先调用readScores()录入成绩,再调用统计方法:
Course *newCourse = new Course(courseCode, courseTitle, creditHrs, numOfStudents);
newCourse->readScores(); // 新增此行,先填充成绩再做计算
double max = newCourse->getMax();
double average = newCourse->getAverage();
double min = newCourse->getMin();
  1. 清理输入流残留的换行符,避免后续输入异常,在所有std::cin >>读取操作后添加缓冲区清理代码:
// 引入头文件 <limits> 后使用
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  1. 建议优化对象创建方式,直接在栈上创建对象,避免内存泄漏:
// 不需要new,直接栈上创建,用完自动释放
Course newCourse(courseCode, courseTitle, creditHrs, numOfStudents);
newCourse.readScores();
double max = newCourse.getMax();
// 后续调用方法统一用.而不是->

内容的提问来源于stack exchange,提问作者pcana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:54:05