从模板化链接列表中删除节点时的Segfault

时间:2014-02-28 18:10:50

标签: c++ linked-list clear

现在我正在开发一个 LinkedList 项目,目前使用clear方法非常奇怪:

template <class Elm>
void LinkedSortedList<Elm>::clear() {
     if (head != NULL) {
        LinkedNode<Elm>* currentNode = head;
        LinkedNode<Elm>* nextNode;
        if (head->next != NULL) {
           nextNode = head->next;
        }
        while (currentNode != NULL) {  
           nextNode = currentNode->next; 
           delete currentNode;
           currentNode = nextNode;

        }
        head = NULL;
     }
}

在行

之前,所有内容似乎都能正常工作
nextNode = currentNode->next;

其中 currentNode的 nextNode的值都切换为两个完全不同的极大值。在该行之前,两个变量都具有适当的值。什么时候

delete currentNode;
在下一行中调用

,我立即得到一个段错误,即使它看起来不像节点的地址有任何改变。

是否有任何可能导致指针突然指向两个完全不同的位置?

编辑:这是LinkedNode类,

#ifndef _LinkedNodeClass_
#define _LinkedNodeClass_

#include <iostream>
using namespace std;

template <class Elm> class LinkedNode {
public:

  Elm value;            // The data value
  LinkedNode *next;     // Pointer to the next node

  // Simple inline constructor:  initialize values
  LinkedNode(Elm newval = 0, LinkedNode* newptr = NULL)
      {value = newval; next = newptr;} 
  ~LinkedNode() {delete &next;}

  // Inline print function:  print the node's value
  void print() {cout << value;}

};

#endif

1 个答案:

答案 0 :(得分:0)

  

是否有任何可能导致指针突然指向两个完全不同的位置?

是的!如果您没有在类构造函数或赋值运算符中正确初始化LinkedNode<T>::next NULL,则它们可能包含未初始化或无效的值。许多编译器使用特殊值来指示调试版本中未初始化的指针。

对于先前已删除的'悬空'指针,也可能发生这种情况。情况可能就是这样,因为在析构函数中,您已经删除了next指针:

~LinkedNode() {delete &next;}

因此nextclear()函数的下一个迭代步骤中无效。更糟糕的是,您使用的语法是有效的,但在语义上是错误的:您正在尝试删除next指针变量本身所在的地址(当然从未使用new分配)。