0

我收到以下代码的“分段错误(核心转储)”运行时错误:

#include <iostream>
#include "Student.h"
#include "SortedList.h"

using namespace std;

#define BOUNDS 100

int main() {

    SortedList *list = new SortedList();  // points to the sorted list object
    Student *create[BOUNDS];  // array to hold 100 student objects
    int num = 100000;   // holds different ID numbers

    // fills an array with 100 students of various ID numbers
    for (int i = 0; i < BOUNDS; i++) {
        create[i] = new Student(num);
        num += 10;
    }

    // insert all students into the sorted list
    for (int i = 0; i < BOUNDS; i++)
    list->insert(create[i]);

    // individually deletes each student
    num = 100000;
    for (int i = 0; i < BOUNDS; i++) {
        delete list->find(num);
    num += 10;
    }

    // insert all students into the sorted list
    for (int i = 0; i < BOUNDS; i++)
    list->insert(create[i]);

    num = 100000;
    for (int i = 0; i < BOUNDS; i++) {
    list->remove(num);
    num += 10;
    }

    cout << "test2" << endl;
    delete list;
    return 0;
}

我已将错误缩小到delete list;行(或先出现的任何一个)。我只是想知道为什么会这样以及如何解决它。关于这个问题的任何见解都会很有用。

4

5 回答 5

1

你有两个我可以看到的问题。

首先,在这个循环中:

for (int i = 0; i < BOUNDS; i++) {
    x = new Student(num);
    num += 10;
}

您正在创建一堆动态Students 并将最新的放入其中,x而前一个则丢失了。这会Student动态创建 100 个,其中 99 个被泄露。Student此外,它不会像上面的评论所说的那样用 s 填充数组。我不确定您要在这里做什么,所以我无法评论您需要做什么。

其次,你在delete这里打电话:

delete list->find(num);

Student自动存储(堆栈)中的 s 上(因为您在列表中填充了指向保存自动s 的Students 的指针),这会导致未定义的行为,并且可能是您的段错误的原因。您不需要释放这些s,因为当数组在.createStudentStudentmain

于 2012-04-11T23:32:24.050 回答
0

您肯定在泄漏内存:

// fills an array with 100 students of various ID numbers
for (int i = 0; i < BOUNDS; i++) {
    x = new Student(num);
    num += 10;
}

x除非 ctor 以Student某种方式神奇地将自身插入到某个可以跟踪指针的位置,否则在此代码段中会泄漏。

这可能或可能与坠机有关。

于 2012-04-11T23:30:51.983 回答
0

在不知道如何StudentList实施的情况下,这有点像在黑暗中拍摄,但是......

list->insert(&create[i]);正在将堆栈分配的对象添加到列表中,然后delete list->find(num);尝试删除此堆栈分配的对象。您不能delete堆叠分配的对象。

除此之外,您的第一个for循环正在泄漏内存。

而我一直是忍者。

于 2012-04-11T23:33:12.273 回答
0

这条线有问题:

list->insert(&create[i]);

此时,create已分配,但没有放入任何内容。可能的结果x = new Student(num)应该分配在那里。

于 2012-04-11T23:33:58.503 回答
0

“创建”数组在堆栈上分配。您正在尝试删除堆栈分配的内存,这就是您收到此错误的原因。

删除列表->查找(编号);

于 2012-04-11T23:39:20.760 回答