失控指针在分配中造成混乱

时间:2017-03-19 05:32:47

标签: c++

我是新来的,我不确定这是否适合发布,但我有点紧张......

我正在参加一个C ++入门课程并且有一个我很好的作业,并且我一直收到这个我无法解决的错误。我问我的补充教练和其他学生,他们认为这是一个失控的指针。我想我已经将问题隔离到一些代码但行为很奇怪。赋值调用使用student类读取两个文件并输出。现在我正在尝试解决这个错误,特别是因为它明天到期(已经工作了2周)。代码在这里:

https://github.com/MetroMayhem/Project1

当我发表评论时,我没有收到错误:

istream & operator>>(istream & in, Student & s)
{
    in >> s.SID;
    in >> s.firstName;
    in >> s.lastName;
    in >> s.courseCount;
    //"""this part: v"""
    //for (int i = 0; i < s.courseCount; i++)
    //  in >> s.courses[i];

    return in;
}

但是当我不评论它并且只在我的主要创建一个学生对象时,将信息读入其中并输出它,它就可以了。但是当我尝试循环读取它时,我得到一些疯狂的wacko错误,打开'xutility'文件并说我正在访问无效的内存。

这在我的main()中不起作用:

while (studentInput.good()) {
    studentInput >> students[studentIndex++];
}

但这有效:

studentInput >> students[0];
studentOutput << students[0];

我只是各种各样的困惑,任何提示都会很好。

编辑:很抱歉提出这个问题,因为它太模糊了。我将继续尝试修复它并让你知道我是否发现了什么错误。

Edit2:感谢您提供的意见,我可以通过您的提示让我的所有错误消失并让我的程序运行。

3 个答案:

答案 0 :(得分:0)

可能您忘了为s.courses分配内存:

s.courses.resize(s.courseCount);

此外,您可能忘记将内存分配给students。您应该执行以下任一操作:

students.resize(numberOfStudents); // it should not be more than numberOfStudents students
while (studentInput.good()) {
    studentInput >> students[studentIndex++];
}

或:

while (studentInput.good()) {
    studentInput >> student;
    students.push_back(student);
}

或:

while (studentInput.good()) {
    students.resize(studentIndex);
    studentInput >> students[studentIndex++];
}

答案 1 :(得分:0)

operator>>()内,您的代码会修改s.courses[i]。您未提供有关courses的内容的信息。

大概是 - 尽管你没有这么说 - 指针,数组或std::vector<Something>。在所有这些情况下,大小必须不小于s.courseCount,但您的代码无法确保这一点。如果大小不够,代码将显示未定义的行为(一个常见但不保证的症状是程序崩溃)。

同样,循环

while (studentInput.good()) {
    studentInput >> students[studentIndex++];
}

需要确保students包含所需数量的元素。否则结果也是未定义的行为。

要意识到的是,数组和标准容器(如std::vector)在访问元素时不会神奇地调整自己的大小(例如studentInput >> students[studentIndex++]并不能神奇地确保students包含的元素超过studentIndex个元素。)

您实际上没有指定Student::coursescourses类型中名为Student的成员)是什么,或者students是什么(在后面的代码中)std::vector。所以不可能就如何调整它们提供建议。它们是什么(例如数组,指针,function getShortest(arr) { return arr.reduce(function(acc, value) { if (typeof value == 'string') { if (acc === null || value.length < acc.length) { acc = value; } } return acc; }, null) || ''; } var test0 = [ 4, 'two','one', 2, 'three']; // Has strings var test1 = [ 4, {},[], 2, new Date()]; // No strings var test2 = []; // Empty var test3 = [ 4, 'two','', 2, 'three']; // Has strings, shortest empty console.log('test0: "' + getShortest(test0) + '"'); // "two" console.log('test1: "' + getShortest(test1) + '"'); // no strings console.log('test2: "' + getShortest(test2) + '"'); // empty console.log('test3: "' + getShortest(test3) + '"'); // "")将决定它们的大小(或者甚至是否)。

答案 2 :(得分:0)

错误发生在你的resizeArray中。只要studentIndex&lt; ARRAY_SIZE。

如果resizeArray不是必需的,我会亲自废弃它并直接获取文件大小,然后创建一个这个大小的学生数组。我这样做是为了让它完全发挥作用:

//move file cursor to end
studentInput.seekg(0, studentInput.end);

//get file length
int ARRAY_SIZE = studentInput.tellg();

//return cursor to beginning of file
studentInput.seekg(0, studentInput.beg);

int studentIndex = 0;
Student *students = new Student[ARRAY_SIZE];

//short circuit array size, and keep reading until EOF/bad
while ((studentIndex < ARRAY_SIZE) && (studentInput >> students[studentIndex++])) {
}