Каков источник этой ошибки сегментации? - PullRequest
1 голос
/ 24 октября 2011

У меня здесь странная ошибка: 882 Segmentation fault ./a.out

Сегмент кода:

int end=array.Length, loop=0;
cout<<end<<" about to print";
for(;loop<end;loop++){
    cout<<"\nMr. loop says: ";
    array.get(loop).print(fout);
}

Вывод моей программы:

enpty initializer called for llist
enpty initializer called for entry
adding
adding
999deleting999
done deleting
123deleting123
done deleting
333deleting333
done deleting
printing
2 about to print
./g+: line 7:   882 Segmentation fault      ./a.out

и жизненный выход:

printing
2 about to print
./g+: line 7:   882 Segmentation fault      ./a.out

означает, что ошибка в этой строке:

for(;loop<end;loop++){

, который доказал хорошие значения и синтаксически правильный (да, я знаю его плохой стиль, хотя).

Идеи? Кажется, никто в моем университете не сможет мне помочь с этим.

вот файлы:

Ответы [ 4 ]

3 голосов
/ 24 октября 2011

Если вы не выполняете низкоуровневые операции с памятью (и вы не делаете это в опубликованной программе), ошибка сегментации является признаком повреждения памяти, т.е. вы испортили некоторыекодирование.Обратите внимание, что повреждение памяти обычно происходит до возникновения ошибки.В исключительных случаях первоначальное повреждение памяти и фактическая ошибка сегментации могут занимать часы и модули друг от друга.

Ваш первый шаг должен состоять в том, чтобы запустить программу в valgrind или gdb, чтобы выяснить подробности ошибки сегментации.Кроме того, всегда компилируйте как минимум с gcc -Wall и принимайте к сведению каждое предупреждение - если вы не изменяете компилятор, изменения - это каждое предупреждение указывает на ошибку.

В вашем случае ошибка почти навернякареализация llist.У этой реализации есть ряд проблем:

  • Реализации не принадлежат файлам .h, они должны быть в файлах .cpp.
  • entry.towardsback и entry.towardsfrontобычно называются prev (ious) и next - эти имена короче и их легче различить.
  • hold, вероятно, следует называть head, в соответствии с общими соглашениями об именах связанных списков.
  • В списке длиной 0 не должно быть записей, т.е. он должен быть инициализирован с помощью hold == NULL.
  • Из строки 61 (в add):

hold->towardsback = node;
hold->towardsback->towardshead = node; // node->towardshead = node;

Вторая строка почти наверняка неверна.Вы, вероятно, хотите сначала настроить node, а затем просто установить hold->towardsback = node;.

1 голос
/ 24 октября 2011

Хорошо, я вижу несколько проблем при беглом взгляде на ваш код.

  1. В вашей записи <> class

    operator T* () {return &stud;}
    

stud уже Т *.Теперь вы возвращаете адрес этого указателя, а не сам указатель.

  1. В вашем llist классе

    if(temp==temp->towardsback){
            delete this;
    

Какойпо сути, удалит ваш класс списка, если это условие истинно.Ой?

Лично я думаю, что вам нужно снова начать реализацию списка:)

1 голос
/ 24 октября 2011

Скорее всего, потому, как вы управляете своим списком.Вы добавляете / удаляете динамически размещенные объекты и передаете их по ссылке.Это плохая идея.

0 голосов
/ 24 октября 2011

Я работаю в основном с c #, но есть ли индекс массива 0 в c ++?Таким образом, вам нужно установить конец для массива. Длина-1.По крайней мере, в c # первым элементом массива будет массив [0].

...