2016-03-11 2 views
-2

У меня есть базовый класс, называемый IntList, в файле IntList.h. И унаследованный класс SortedSet в файле SortedSet.h. IntList имеет следующую структуру: -Ошибка сегментации

struct IntNode 
{ 
    int data; 
    IntNode *next; 
    IntNode(int data) : data(data), next(0) {} 
}; 

Следующий код является другом функция класса SortedSet. Эта функция возвращает объект SortedSet, который является объединением двух объектов SortedSet, левого и правого операндов этого двоичного оператора.

SortedSet operator|(const SortedSet &lho, const SortedSet &rho) 
{ 
    SortedSet temp; 
    IntNode* set1 = lho.head; 
    IntNode* set2 = rho.head; 

    while(set1->next != 0) 
    { 
     temp.push_back(set1->data); 
     set1 = set1->next; 
    } 

    delete set1; 

    while(set2->next != 0) 
    { 
     if (temp.in(set2->data) == false) 
     { 
      temp.push_back(set2->data); 
      //cout<<"It isn't in there"<<endl; 
     } 
     set2 = set2->next; 
    } 
    delete set2; 

    return temp; 
} 

У меня возникает ошибка сегментации, и я не могу ее исправить. Любая помощь будет оценена по достоинству. Благодаря!

+6

Похоже, вам, возможно, потребуется узнать, как использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Можете ли вы разместить стек вызовов? – user16

+0

Что вы имеете в виду? как я называю это через главную? –

ответ

1

Одна очевидная ошибка в вашем коде заключается в том, что вы проверяете, что set1->next не является нулевым, если вы должны проверить, что set1 не является нулевым. Из ограниченной информации, которую вы опубликовали, трудно быть уверенным, что это единственная проблема, но это почти наверняка вызовет ошибку сегментации, поэтому я уверен, что это проблема.

Измените время петли, чтобы выглядеть следующим образом:

while(set1 != 0) 
{ 
    temp.push_back(set1->data); 
    set1 = set1->next; 
} 

Затем хлопнуть себя по лбу, потому что это было бы очень легко подобрать с быстрым применением отладчика.

РЕДАКТИРОВАТЬ: Вы также должны удалить операции delete, потому что они всегда будут действовать на нулевой указатель. Непонятно, почему вы хотели бы удалить только один элемент своего списка, так что, возможно, вам не нужно делать то, что, по вашему мнению, вам не нужно, хотя без информации о работе SortedSet это трудно понять.

Смежные вопросы