通用链表指针访问

时间:2011-10-03 01:32:01

标签: c++ pointers linked-list generic-list

我正在使用模板在C ++中编写通用链接列表,并且在访问节点值时遇到了分段错误。

为了简化测试用例,我实现了一个固定大小的双节点链表。

我有两个问题:

1a)为什么aList.headNodePtr-> prevNodePtr设置为NULL?

1b)为什么aList.tailNodePtr-> nextNodePtr设置为NULL?

我在LinkedList构造函数中将这两个值都设置为NULL,但main中的输出显示:

head prevAddress: 0x89485ed18949ed31
tail nextAddress: 0x7fffe8849679

2)为什么main()中的以下行导致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;
}

1 个答案:

答案 0 :(得分:2)

您实际上并未设置成员,而是设置您在ctor中声明的本地人:

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>;