2011-10-03 77 views
0

我正在使用模板在C++中編寫通用鏈接列表,並且在訪問節點值時遇到了分段錯誤。通用鏈接列表指針訪問

爲了簡化測試用例,我實現了一個固定大小的雙節點鏈表。

我有兩個問題:

1A)爲什麼不aList.headNodePtr-> prevNodePtr設置爲NULL?

1b)爲什麼不將aList.tailNodePtr-> nextNodePtr設置爲NULL?

我設置了這兩項數值爲NULL LinkedList的構造,但在主顯示輸出是:

head prevAddress: 0x89485ed18949ed31 
tail nextAddress: 0x7fffe8849679 

2)爲什麼在主)以下行(使賽格故障?

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

你爲什麼要'刪除'headNodeP在將它們設置爲NULL之後,tr'和'tailNodePtr' **?那是一個內存泄漏。在設置爲「NULL」之前,您需要「刪除」它們。另外,我認爲這是作業或你自己獨立學習的東西,因爲標準C++已經提供了一個經過全面測試的「std :: list」。 –

+0

@ in-silico感謝您解釋有關刪除。我這樣做是因爲之前的一段代碼從雙刪除中崩潰,但顯然這種「治癒」不是正確的! – Jeremiah

回答

2

你不是在實際設置的成員,您正在爲您設定在構造函數中聲明的當地人:

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

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

試試這個相反:

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

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

謝謝。看起來很明顯,你在線索我之後。 – Jeremiah

+0

這是編程的90%。 :) –