现在我正在开发一个 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
答案 0 :(得分:0)
是否有任何可能导致指针突然指向两个完全不同的位置?
是的!如果您没有在类构造函数或赋值运算符中正确初始化LinkedNode<T>::next
NULL
,则它们可能包含未初始化或无效的值。许多编译器使用特殊值来指示调试版本中未初始化的指针。
对于先前已删除的'悬空'指针,也可能发生这种情况。情况可能就是这样,因为在析构函数中,您已经删除了next
指针:
~LinkedNode() {delete &next;}
因此next
在clear()
函数的下一个迭代步骤中无效。更糟糕的是,您使用的语法是有效的,但在语义上是错误的:您正在尝试删除next
指针变量本身所在的地址(当然从未使用new
分配)。