2011-10-03 1 views
0

Я пишу общий связанный список в C++ с использованием шаблонов и испытываю ошибки сегментации при доступе к значениям Узла.общий доступ к указателю на список ссылок

Чтобы упростить проверку, я внедрил фиксированный размер, два узла, связанный список.

У меня есть два вопроса:

1a) Почему не aList.headNodePtr-> prevNodePtr установлен в NULL?

1b) Почему нет aList.tailNodePtr-> nextNodePtr установлен в NULL?

Я установил оба этих значения NULL в конструкторе LinkedList, но вывод в основных показывают, что:

head prevAddress: 0x89485ed18949ed31 
tail nextAddress: 0x7fffe8849679 

2) Почему следующая строка в главном() вызывает Seg Fault?

aList.headNodePtr->nodeValue = 1; 

Полный код ниже:

#include <iostream> 
using namespace std; 

template <class T> 
    class Node { 
    public: 
    Node<T>* prevNodePtr; 
    Node<T>* nextNodePtr; 
    T nodeValue; 
}; 

template <typename T> 
    class LinkedList { 
    public: 
    Node<T>* headNodePtr; 
    Node<T>* tailNodePtr; 

    LinkedList() { 
     Node<T>* headNodePtr = new Node<T>; 
     Node<T>* tailNodePtr = new Node<T>; 

     headNodePtr->prevNodePtr = NULL; 
     headNodePtr->nextNodePtr = tailNodePtr; 
     tailNodePtr->prevNodePtr = headNodePtr; 
     tailNodePtr->nextNodePtr = NULL; 
    } 

    ~LinkedList() { 
     headNodePtr = NULL; 
     tailNodePtr = NULL; 
     delete headNodePtr; 
     delete tailNodePtr; 
    } 
}; 

int main() 
{ 
    LinkedList<int> aList; 
    cout << "head Value: " << aList.headNodePtr->nodeValue << endl; 
    cout << "head prevAddress: " << aList.headNodePtr->prevNodePtr << endl; 
    cout << "head nextAddress: " << aList.headNodePtr->nextNodePtr << endl; 
    cout << "tail Value: " << aList.tailNodePtr->nodeValue << endl; 
    cout << "tail prevAddress: " << aList.tailNodePtr->prevNodePtr << endl; 
    cout << "tail nextAddress: " << aList.tailNodePtr->nextNodePtr << endl; 

    aList.headNodePtr->nodeValue = 1; 
} 
+3

Почему вы 'delete'-ing' headNodeP tr' и 'tailNodePtr' ** после ** установив их в' NULL'? Это утечка памяти прямо там. Вам нужно «удалить» их перед установкой в ​​«NULL». Кроме того, я предполагаю, что это домашнее задание или что-то для вашего собственного независимого исследования, поскольку стандарт C++ уже предоставляет «std :: list», который полностью протестирован. –

+0

@ in-silico спасибо за разъяснение об удалении. Я делал это, потому что предыдущий бит кода рушился от двойных удалений, но, очевидно, это «лечение» не является правильным! – Jeremiah

ответ

2

Вы на самом деле не устанавливая пользователей, вы настраиваете местных жителей вы объявлены в CTOR:

Node<T>* headNodePtr; // <-- MEMBERS 
Node<T>* tailNodePtr; 

LinkedList() { 
    Node<T>* headNodePtr = new Node<T>; // <-- LOCALS 
    Node<T>* tailNodePtr = new Node<T>; 

Try это Вместо этого:

Node<T>* headNodePtr; // <-- MEMBERS 
Node<T>* tailNodePtr; 

LinkedList() { 
    headNodePtr = new Node<T>; // <-- MEMBER ACCESS 
    tailNodePtr = new Node<T>; 
+0

Спасибо. Кажется очевидным после того, как вы меня подсказали. – Jeremiah

+0

Это 90% от программирования. :) –