当我试图创建一个自定义对象数组,然后使用它们时,我会得到一个堆栈转储错误.我做错了什么



我在运行时遇到了这个错误

0[main]test 449 cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到test.exe.stackdump

我对c++编程相对陌生,我来自python,我会链接代码,但有人能告诉我发生了什么,可能是什么问题吗?

#include <string>
#include <iostream>
using namespace std;
struct grade
{
int totalCourses;
string mNumber;
string *courses = new string[totalCourses];
grade(int numOfCourses = 10)
{
totalCourses = numOfCourses;
}

~grade()
{
delete[] courses;
}
};
int main()
{
int totalGrades;
cout << "Enter num of grades: ";
cin >> totalGrades;
grade *gradeArray = new grade[12];
grade newGrade(6);
newGrade.mNumber = "M12345678";
cout << newGrade.mNumber << 'n';
gradeArray[0] = newGrade;
delete[] gradeArray;
return 0;
}

这个问题回答起来有点棘手,因为有两个未定义行为的来源。任何一种都可能导致崩溃,但同时,任何一种似乎都能按预期工作。有些人觉得这很奇怪,但这就是C++中未定义行为的工作原理;这不是"除了预期之外的任何行为都是允许的">,但是简单地";任何行为都是允许的">

问题1

类成员在构造函数体的左大括号之前初始化。这是构造函数的注释版本。

grade(int numOfCourses = 10)   // Constructor starts
// Members `totalCourses`, `mNumber`, and `courses` are initialized here. However,
// you specified an initial value only for `courses`, so effectively you initialize:
// courses = new string[/* unspecified value */];
{
// It is only here, *after* the opening brace, that `totalCourses` gets a value.
totalCourses = numOfCourses;
}

初始化这些相关字段的方式必须一致。如果一个依赖于一个参数,那么两个都依赖于某个参数。使用初始化列表来完成此操作。

grade(int numOfCourses = 10) :
totalCourses(numOfCourses),
courses(new string[numOfCourses]) // Use the parameter for robustness (the order
{}                                    // of fields here is not always the order in
// which the fields are initialized).

问题2

您已经定义了一个(非平凡的(析构函数,但没有遵循"三条规则"。有关为什么需要定义复制构造函数和复制赋值运算符的详细信息,请访问链接(如果这是唯一的问题,这个问题将作为重复问题保持关闭。(

相关内容

最新更新