2016-05-24 12 views
1

C++について学びたいと思います。メモリ管理とデストラクタの概念に問題があります。リンクリストを使用してキューインプリメンテーションを作成しようとしましたが、デストラクタメソッド(太字)でリンクリストノードを削除しようとすると「Aborted(Core Dumped)」エラーメッセージが表示されます。誰かが私が間違っていることを知っているなら、私に知らせてください!ここで C++ LinkedListキューの実装とデストラクタエラー: "Aborted(Core Dumped)"

は私のデストラクタ・メソッドのコードです:

template <class T> 
Queue<T>::~Queue(){ 
    Node<T> *currHead = head; 
    while(currHead != NULL){ 
    Node<T> *nextHead = currHead->next; 
    delete currHead; 
    currHead = nextHead; 
    } 
    Node<T> *currTail = tail; 
    while(currTail != NULL){ 
    Node<T> *nextTail = currTail->next; 
    delete currTail; 
    currTail = nextTail; 
    } 
} 

そして、ここに私の完全なLinkedListのキューの実装の参考のために:

EDIT
template <class T> 
class Node{ 
public: 
    T data; 
    Node<T> *next=NULL; 
}; 

template <class T> 
class Queue{ 
public: 
    Queue(); 
    ~Queue(); 
    void push(T); 
    T pop(); 
    int size=0; 
    Node<T> *head=NULL; 
    Node<T> *tail=NULL; 
}; 

template <class T> 
Queue<T>::Queue(){} 

template <class T> 
Queue<T>::~Queue(){ 
    Node<T> *currHead = head; 
    while(currHead != NULL){ 
    Node<T> *nextHead = currHead->next; 
    delete currHead; 
    currHead = nextHead; 
    } 
    Node<T> *currTail = tail; 
    while(currTail != NULL){ 
    Node<T> *nextTail = currTail->next; 
    delete currTail; 
    currTail = nextTail; 
    } 
} 

template <class T> 
void Queue<T>::push(T data){ 
    Node<T> *node = new Node<T>; 
    node->data = data; 
    if(head == NULL){ 
    head = node; 
    }else{ 
    tail->next = node; 
    } 
    tail = node; 
    size++; 
} 

template <class T> 
T Queue<T>::pop(){ 
    if(size == 0){ 
    throw "Empty Queue"; 
    }else{ 
    Node<T> *oldHead = head; 
    T oldData = oldHead->data; 
    head = head->next; 
    size--; 
    delete oldHead; 
    return oldData; 
    } 
} 

:私も次の定義を試みた

デストラクタのために私は同じエラーを取得しています:

template <class T> 
Queue<T>::~Queue(){ 

    while(head != NULL){ 
    Node<T> *currHead = head; 
    head = head->next; 
    delete currHead; 
    } 

    while(tail != NULL){ 
    Node<T> *currTail = tail; 
    tail = tail->next; 
    delete currTail; 
    } 
} 
+0

'currHead = nextHead;' delete currHead; '?あなたはあなたのコードで何度も似たようなことをしています。 –

+0

私は何をしていますか?私はここで犠牲になっています - あなたが私のEDITを見るなら、私はデストラクタのために何か違うことを試みましたが、あなたのデストラクタだけでなく、あなたの*完全なリンクリストのキューインプリメンテーションでも "Aborted(Core Dumped)"エラー – mathmonkey

+0

あなたは似たような間違いをしています。 –

答えて

3

デストラクタの最初の部分では、先頭からすべてのリスト項目を削除しています。デストラクタの2番目の部分では、最後のリスト項目をもう一度削除しようとしていますが、ポインタは末尾に保持されていますが、最初の部分ではすでに削除されています。ポインタを削除

+0

それは私が思っていたものですが、デストラクタの最初の部分で頭を削除した後でも、まだtail!= NULLなので、後でそれを削除する必要はありませんか? – mathmonkey

+0

@mathmonkey先頭と末尾のポインタは同じアドレスを格納しているので、メモリがすでに削除されていても 'tail!= NULL'は真です。 – Rakete1111

+0

これは問題だと思われますが、実際はそうではありません。この場合、_double free error_のエラーが生成されます。問題はlastの 'next'ポインタが定義されていないことです。したがって、最初のループは決して終了しません。 –

0

は、ポインタまたは削除されたメモリを指す他のポインタを変更しません:あなたのコードがどうあるべきか

#include <iostream> 

int main() { 
    int* head = new int[4]; 
    int* tail = head; 

    delete head; 

    std::cout << "head = " << (void*)head << ", tail = " << (void*)tail << "\n"; 
} 

は次のとおりです。

template<typename T> 
Queue<T>::~Queue(){ 
    Node<T> *currHead = head; 
    while(currHead != nullptr){ 
    Node<T> *nextHead = currHead->next; 
    delete currHead; 
    currHead = nextHead; 
    } 
    head = tail = nullptr; 
    size = 0; 
} 

たり、ポップ機能の場合作品:

template<typename T> 
Queue<T>::~Queue() { 
    while (size) 
     pop(); 
} 
関連する問題