2015-10-11 3 views
0

У меня есть класс stackLL, а функция pop() создает seg-ошибку при использовании в основном. Вот код: Вот что структура и класс определение:Почему этот код создает ошибку seg?

struct llNode{ 
int data; 
llNode* next; 
}; 

class stackLL{ 
public: 
stackLL(); 
void push(int x); 
int pop(); 
void print(); 

private: 
llNode* head; 
}; 

вот определение функции-члена:

int stackLL::pop(){ 
    if (head == NULL){ 
    return false; 
    } 

    else { 
    llNode *tmp= new llNode; 
    cout<<"The integer is: "<<head -> data; 
    tmp = head; 
    head = tmp -> next; 
    delete tmp; 
    return tmp -> data; 

    } 
} 

вот реализация в основном:

stackLL sll; 

пар линии вниз

sll.pop(); 
+0

Есть еще одна проблема в вашей утечке памяти 'pop()' memory. – 4LegsDrivenCat

ответ

3

Вы удивитесь, что это произошло?

delete tmp; 
return tmp -> data; 
+0

Хороший ответ, но вам не хватает предложения или двух объяснений .... –

+0

@Basile Starynkevitch: пусть он делает домашнее задание :-) – jbm

5
delete tmp; 
return tmp -> data; 

Вы удаляете tmp перед возвращением данных. Вы эффективно возвращаете данные, которые не существуют или уже недействительны.
Динамическое размещение tmp не требуется; вы можете просто выделить tmp (т. е. llNode tmp = head;). Это также избавит от segfault.

Кроме того, код для pop, вероятно, не выполняет то, что вы намеревались сделать (или, по крайней мере, не выполняет функцию pop для связанного списка).

Кроме того, вы никогда не должны использовать пустой new или delete (он подвержен ошибкам). Вместо этого используйте один из смарт-указатели, предпочтительно std::unique_ptr<...> (ùnique_ptr не имеет счетчик ссылок)

0

Ну в поп() функцию перед returing в TEMP-> данные, вы на самом деле удалить этот временный узел. Именно по этой причине вы получаете ошибку сегментации.

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