template <typename T>
class LinkedNode
{
public:
T data;
LinkedNode<T> *next;
LinkedNode<T> *prev;
LinkedNode<T>();
LinkedNode<T>(T);
};
// Default constructor
template <typename T>
LinkedNode<T>::LinkedNode()
{
next = NULL;
prev = NULL;
}
template <typename T>
class LinkedList
{
private:
LinkedNode<T> *head;
public:
LinkedList<T>();
~LinkedList<T>();
void addFront(T);
void addBack(T);
void addAt(T, int);
void removeFront();
void removeBack();
void removeAt(int);
void printList();
};
// Constructor
template <typename T>
LinkedList<T>::LinkedList()
{
head = NULL;
}
// Add new node to front
template <typename T>
void LinkedList<T>::addFront(T d)
{
LinkedNode<T> temp;
temp.data = d;
if (head == NULL)
{
head = &temp;
}
else
{
temp.next = head;
head->prev = &temp;
head = &temp;
}
}
// Add new node to back
template <typename T>
void LinkedList<T>::addBack(T d)
{
// Find the back of this list
LinkedNode<T> *ptr;
ptr = head;
while (ptr->next != NULL) // <------- DIES HERE, MEMORY ACCESS VIOLATION
{
ptr = ptr->next;
}
// Make a new node and join it to the back
LinkedNode<T> temp;
temp.data = d;
temp.prev = ptr;
ptr->next = &temp;
}
다음은 연결된 목록 시스템의 스 니펫입니다. 문제는 표시된 줄에 오류가 발생한다는 것입니다. 디버거는 "head"포인터가 "next"또는 "prev"가없는 LinkedNode의 합법적 인 메모리 주소를 가리키고 있지만 "ptr"포인터는 주소의 주소가 아닌 0xcccccc를 가리키고 있다고 말합니다. 나는 정말로 혼란 스럽다. 나는 포인터를 이해할 줄 알았다.C++ 연결된 목록 도움말 (포인터)?
일반적으로 0xcccccc는 가리키는 메모리가 초기화되지 않은 쓰레기임을 알리는 디버거입니다. 디버거가 맞으면 ptr = head가 올바르므로 오류가 루프에 있습니다. ptr = ptr-> 다음에 ptr은 쓰레기가되었습니다. 그래서 어떻게 든 사슬에서 실수가 있습니다. – VoidStar