【问题标题】:C++ linked list help (pointers)?C++ 链表帮助(指针)?
【发布时间】:2011-10-13 05:08:29
【问题描述】:
template <typename T>
class LinkedNode
{
public:
    T data;
    LinkedNode<T> *next;
    LinkedNode<T> *prev;
    LinkedNode<T>();
    LinkedNode<T>(T);
};

// Default constructor
template <typename T>
LinkedNode<T>::LinkedNode()
{
    next = NULL;
    prev = NULL;
}



template <typename T>
class LinkedList
{
private:
    LinkedNode<T> *head;
public:
    LinkedList<T>();
    ~LinkedList<T>();
    void addFront(T);
    void addBack(T);
    void addAt(T, int);
    void removeFront();
    void removeBack();
    void removeAt(int);
    void printList();
};

// Constructor
template <typename T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}

// Add new node to front
template <typename T>
void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;

    if (head == NULL)
    {
        head = &temp;
    }
    else
    {
        temp.next = head;
        head->prev = &temp;
        head = &temp;
    }
}

// Add new node to back
template <typename T>
void LinkedList<T>::addBack(T d)
{
    // Find the back of this list
    LinkedNode<T> *ptr;
    ptr = head;

    while (ptr->next != NULL) // <------- DIES HERE, MEMORY ACCESS VIOLATION
    {
        ptr = ptr->next;
    }

    // Make a new node and join it to the back
    LinkedNode<T> temp;
    temp.data = d;
    temp.prev = ptr;
    ptr->next = &temp;
}

这是我的链表系统中的一个 sn-p。问题是它在指示的行上引发错误。调试器说“head”指针指向一个没有“next”或“prev”的LinkedNode的合法内存地址,但“ptr”指针指向地址0xcccccc,而不是head的地址?我真的很困惑,我以为我理解了指针!

【问题讨论】:

  • 一般来说,0xcccccc 是调试器告诉你指向的内存是未初始化的垃圾。如果调试器是正确的,由于 ptr=head 是正确的,错误就在循环中。在 ptr = ptr->next 之后 ptr 变成了垃圾。所以不知何故,链条中出现了错误。

标签: c++ list pointers linked-list


【解决方案1】:
void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;
    ...
    head = &temp;
    ...
}

temp是一个自动存储的变量,它的生命周期将在addFront函数返回时结束,你会得到一个指向无效对象的指针。您必须在堆中分配节点,而是这样做:

    LinkedNode<T>* temp = new LinkedNode<T>;
    temp->data = d;
    ...
    head = temp;

【讨论】:

  • 是的,这绝对是问题所在。堆是最好的通用方式,但不要忘记仔细考虑节点将如何在~LinkedList()中被全部删除!确保不允许对列表进行操作,从而使任何节点成为“孤立”,否则您将发生内存泄漏。
【解决方案2】:

我确认 K-ballo 的回答。 问题是您添加的对象在 addFront 函数离开其范围时被销毁。你所拥有的是一个无效指针列表。

如上所示用new分配元素,但是当你从列表中删除一个元素时不要忘记清理(删除指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多