实例化新类时出现c++错误
c++ error when instantiating a new Class
我有一个"class"类,它有一个字符串名称和一个"Student"对象数组。"学生"类有一个名称,并有"成绩"。"Grades"类是一组替身。
在主类中,我创建了一个Grades对象和一个Student对象。我用它测试了一些功能,一切都很好:
int main(){
cout << fixed << setprecision(2);
Grades test = Grades ("5 - 90.0 85.0 95.5 77.5 88.0");
cout << test.toString() << endl;
cout << "nSum = " << test.getSum() << endl;
cout << "Num grades = " << test.getNumGrades() << endl;
cout << "Low grade = " << test.getLowGrade() << endl;
cout << "High grade = " << test.getHighGrade() << endl;
Student stu = Student("Billy Bob", "5 - 90 85 95.5 77.5 88");
cout << stu.toString() << endl;
cout << "nSum = " << stu.getSum() << endl;
cout << "Average = " << stu.getAverage() << endl;
cout << "Average after dropping low grade = " << stu.getAverageMinusLow() << endl;
cout << "Low grade = " << stu.getLowGrade() << endl;
cout << "High grade = " << stu.getHighGrade() << endl;
}
然而,当我添加行时:
Class testClass = Class("Comp Sci 1", 3);
然后运行程序,它会出现堆栈溢出错误。"Gradebook.exe中0x0033EAB7处的首次机会异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x003D2000)。"
如果存在此异常的处理程序,则程序可以安全地继续运行。是不是因为对象太多,每个对象都是另一个对象的成员?有没有办法"删除"我的"测试"answers"stu"对象,这些对象是在这行之前创建的?
以下是我的"类"构造函数供参考:
class Class{
private:
string name;
Student studentList[100];
int numStudents;
public: Class(string className, int numStudents1);
Class();
}
Class:: Class(string className, int numStudents1){
name = className;
numStudents = numStudents1;
}
Class:: Class(){
name = "";
numStudents = 0;
}
出现此错误是因为Class对象中的"studentList"Student数组没有在构造函数中实例化吗?
函数中声明的每个变量都位于堆栈上,函数外声明的变量都是静态变量,并使用数据段。
Class testClass("Comp Sci 1", 3);
int main(){
这在某些方面也很糟糕,但并没有引起堆叠式气流那么严重。
那个设计显然是错误的。
你应该在Student
中有一个向量或类似的容器来容纳所有年级,在Class
中应该有一个类似的容器,来容纳所有学生。你说你的老师不允许你使用vector,这对你的水平没有多大意义,但也许他希望你创建自己的容器类?再说一遍,你似乎还没有完全做到这一点,所以这是一种悖论。
你的问题是,你在一个班里为100名学生分配了足够的存储空间,而这100名学生可能有很多成绩,所以这个班可能会变得很大,太大了,无法放在堆栈上,这就是它溢出的原因。这样,班级加上学生加上成绩,就形成了一大块"扁平"记忆。当您在没有编译器优化的情况下使用这种形式的实例化Class testClass = Class(...)
时,它不会创建一个而是创建两个对象,只是将后者分配给前者。修复类构造函数(你也应该修复另一个)可能会解决溢出问题,但它不能解决你的设计问题。
在内存中使用Class
这样的大型结构要简单得多,并且推荐良好的做法。将其扁平化实际上更复杂,但可能具有其他优势(如性能或内存效率),并且与动态分配一起使用仍然是安全的,但在您的情况下,您对一流的效率不感兴趣,而是对理解感兴趣,因此具有良好的设计。
此外,正如评论中提到的,创建一个有成绩的学生是错误的,尤其是将成绩作为字符串文字传递。如果这是一个你必须在实践中使用的真正的程序,如果成绩还没有出来,你将如何在年初培养出所有成绩的新生?Student类构造函数应该只传递学生的名称,而应该具有addGrade()
成员函数。
那么Class对象预分配一个长度为100的静态数组呢?如果你只有3个学生,那么就浪费了97个学生的记忆。如果你需要100多名学生怎么办?您的程序崩溃。这就是为什么你应该使用一个容器,并且只有你需要的那么多学生。我只能假设同样可怕的事情正在学生班里发生。这些类型的"技术"通常用于旧的C代码,这可能是你的老师所困扰的,但肯定不建议用于教授现代C++。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'