【问题标题】:When I try to create an array of custom objects and then use them I get a stack dump error. What am I doing wrong?当我尝试创建自定义对象数组然后使用它们时,出现堆栈转储错误。我究竟做错了什么?
【发布时间】:2021-01-11 09:23:05
【问题描述】:

我在运行时遇到此错误

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;
}

【问题讨论】:

  • 另外,使用数组而不是更标准的向量有什么特别的原因吗?
  • 这似乎是问题所在:string *courses = new string[totalCourses];
  • gradeArray[0] = newGrade; 另一个问题。您的grade 类没有正确遵守rule of three。您正在分配 grade 对象,而 grade 的复制语义不正确。
  • 好吧,在某些时候,OP 必须正确实现复制语义。也许通过这样做,他们将修复所有其他错误。或者只是使用 std::vector 并让它完成工作。
  • 每日调试提示: 创建一个minimal reproducible example。删除行,直到您有最少的行来证明您的问题。看起来您尝试了对 grade 对象的一些测试;哪一个导致崩溃?你能避免将一个成绩分配给另一个成绩吗?消除阅读和设置mNumber 字段?消除创建(和删除)一系列成绩对象?崩溃所需的最低限度是多少,崩溃发生在哪一行?

标签: c++ struct runtime-error dynamic-memory-allocation


【解决方案1】:

这个问题有点难以回答,因为undefined behavior 有两个来源。任何一个都可能导致崩溃,但同时,任何一个似乎都可以按预期工作。有些人觉得这很奇怪,但这就是未定义行为在 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;
    }

您必须始终如一地初始化这些相关字段。如果一个依赖于一个参数,那么两者都依赖于一个参数。使用initialization list 来完成此操作。

    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

您已经定义了一个(非平凡的)析构函数,但没有遵循Rule of Three。请点击链接了解为什么需要定义复制构造函数和复制赋值运算符(如果这是唯一的问题,则此问题将作为重复问题保持关闭。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2013-08-06
    相关资源
    最近更新 更多