2011-10-03 85 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%。 :) –