2011-10-13 4 views
0
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++ 연결된 목록 도움말 (포인터)?

+0

일반적으로 0xcccccc는 가리키는 메모리가 초기화되지 않은 쓰레기임을 알리는 디버거입니다. 디버거가 맞으면 ptr = head가 올바르므로 오류가 루프에 있습니다. ptr = ptr-> 다음에 ptr은 쓰레기가되었습니다. 그래서 어떻게 든 사슬에서 실수가 있습니다. – VoidStar

답변

5
void LinkedList<T>::addFront(T d) 
{ 
    LinkedNode<T> temp; 
    temp.data = d; 
    ... 
    head = &temp; 
    ... 
} 

temp 자동 스토리지의 변수, 그 수명은 즉시 addFront 함수가 반환으로 종료되고 당신은 잘못된 개체에 대한 포인터를 얻을 것이다. 힙에 노드를 할당해야하므로 다음과 같이하십시오.

LinkedNode<T>* temp = new LinkedNode<T>; 
    temp->data = d; 
    ... 
    head = temp; 
+0

예, 이것은 분명히 문제입니다. 힙이 가장 좋은 방법이지만, ~ LinkedList ()에서 노드가 모두 삭제되는 방법을주의 깊게 고려해야합니다! !! 노드가 "고아"가되거나 메모리 누수가 발생하도록 목록을 조작하지 못하게하십시오. – VoidStar

1

나는 K-ballo의 답변으로 확인합니다. 문제는 addFront 함수가 범위를 벗어날 때 추가하는 객체가 삭제된다는 것입니다. 가지고있는 것은 잘못된 포인터 목록입니다.

위와 같이 new로 요소를 할당하지만 목록에서 요소를 제거 할 때 정리하는 것을 잊지 마십시오 (포인터 삭제).