我正在使用模板在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