我正在使用模板在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;
}
你为什么要'删除'headNodeP在将它们设置为NULL之后,tr'和'tailNodePtr' **?那是一个内存泄漏。在设置为“NULL”之前,您需要“删除”它们。另外,我认为这是作业或你自己独立学习的东西,因为标准C++已经提供了一个经过全面测试的“std :: list”。 –
@ in-silico感谢您解释有关删除。我这样做是因为之前的一段代码从双删除中崩溃,但显然这种“治愈”不是正确的! – Jeremiah