Я пишу общий связанный список в C++ с использованием шаблонов и испытываю ошибки сегментации при доступе к значениям Узла.общий доступ к указателю на список ссылок
Чтобы упростить проверку, я внедрил фиксированный размер, два узла, связанный список.
У меня есть два вопроса:
1a) Почему не aList.headNodePtr-> prevNodePtr установлен в NULL?
1b) Почему нет aList.tailNodePtr-> nextNodePtr установлен в NULL?
Я установил оба этих значения NULL в конструкторе LinkedList, но вывод в основных показывают, что:
head prevAddress: 0x89485ed18949ed31
tail nextAddress: 0x7fffe8849679
2) Почему следующая строка в главном() вызывает Seg Fault?
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;
}
Почему вы 'delete'-ing' headNodeP tr' и 'tailNodePtr' ** после ** установив их в' NULL'? Это утечка памяти прямо там. Вам нужно «удалить» их перед установкой в «NULL». Кроме того, я предполагаю, что это домашнее задание или что-то для вашего собственного независимого исследования, поскольку стандарт C++ уже предоставляет «std :: list», который полностью протестирован. –
@ in-silico спасибо за разъяснение об удалении. Я делал это, потому что предыдущий бит кода рушился от двойных удалений, но, очевидно, это «лечение» не является правильным! – Jeremiah