2012-01-22 6 views
-1

これまでリンクリストクラスを作成しましたが、リンクリストテンプレートクラスを作成する必要があります。大したことではありませんが、私はdelete演算子の大きな問題で問題を抱えてきました。 できるだけ多くのコードを再利用しましたが、ノードを削除する関数が両方のプログラムで同じように動作しない理由を理解できません。テンプレートクラスの実装では、削除でメモリを解放しようとしたときに実行時エラーが発生します。C++リンクリストテンプレートクラスを使用したメモリ管理

はここに関連するコードです:

すべてのノードは、次の関数を経由してmain.cppにに追加された

すべてのノードは、次の関数を経由してmain.cppにして削除され
template <class T> 
void LinkedList<T>::insert(T data) 
{ 
    if(pHead == NULL) 
    { 
     pHead = new LinkedList<T>(data); 
    } 
    else 
    { 
     LinkedList<T> *ptr = pHead; 
     while(ptr->pNext != NULL) 
     { 
      ptr = ptr->pNext; 
     } 
     ptr->pNext = new LinkedList<T>(data); 
    } 
} 

template <class T> 
void LinkedList<T>::removeFirst() 
{ 
    if(!pHead) return; 
    else 
    { 
     LinkedList<T> *next = pHead; 
     pHead = pHead->pNext; 
     if(next != NULL) 
     { 
      delete next; 
     } 
    } 
} 

私のデストラクタコードは次のとおりです。

template <class T> 
LinkedList<T>::~LinkedList() 
{ 
    clear(); 
} 

template <class T> 
void LinkedList<T>::clear() 
{ 
    LinkedList<T> *ptr = pHead; 
    while(ptr) 
    { 
     LinkedList<T> *pTemp = ptr->pNext; 
     delete ptr; 
     ptr = pTemp; 
    } 
    pHead = NULL; 
} 

removeFirst関数がdeleteを呼び出そうとした時点でアクセス違反が発生します。 問題はシンプルだと思っていますが、ほとんど同じコードがテンプレート以外の実装で働いていたので、壁に頭を長打する前に他の人の考えを見てみたかったのです。

ありがとうございました。

+0

「LinkedList」の宣言はどこですか? –

+0

問題はありませんが、すでに 'pHead'をチェックして' next'に割り当てているので、 'reomveFirst'関数で' if(next!= NULL) 'の理由が見つかりません。 –

+2

問題は、デバッガでコードをステップ実行することで解決できます(または少なくとも分離されている)。 –

答えて

3

以下の3つの機能を明確に考え、1つの項目だけを削除するか、リスト全体をクリアするかを決定する必要があります。

removeFirst 
clear 
~LinkedList 

これらの機能はすべて、リスト全体をクリアしようとします。 clearのコードが同じものを複数回削除しようとするため、クラッシュが発生します。

ご迷惑をおかけして申し訳ございませんが、コードにはさまざまな形でひどい欠陥があります。あなたはおそらく次たい:

~LinkedList() // delete *just this one node*, leaving the rest intact 
clear()  // scan through the list. deleting each node (individually) in turn 
removeFirst // delete just one node. 

deleteへのすべての呼び出しは、現在、そして、リスト全体をクリアしようとし~LinkedListへの呼び出しにつながります。

+0

それは本当に問題になるでしょう。さて、ここに質問があります。コンストラクタを空にしたのは、コンパイラが提供するデフォルトコンストラクタを使用させるとコンパイルされないためです。それは大丈夫でしょうか?または私は蹴らなければならない悪い習慣? – joshuaegclark

+1

私はこれを信じるとは思わない:*「コンストラクタを空にしたのは、コンパイラが提供するデフォルトコンストラクタを使用するとコンパイルされないためです。」*関連するすべてのものを表示する必要がありますコード。それは何のエラーでしたか? –

0

これはコードの残りの部分、つまりコンストラクタ、またはpHeadの使用を最初のノード以外で見ることなく、教育的な推測に過ぎません。

あなたは〜を呼び出すnext onを呼び出すと〜LinkedListが呼び出されます。これは、clear()を呼び出します。

削除するノードのpHeadは、最初のノードではないため実際には意味がなく、初期化されていないものと思われます。

KABOOM私は追加して、実際のLinkedListのために別のクラスを作る推薦/のみpNextポインタを必要とするリスト(LinkedListNode?)のメソッド、およびノー​​ドを削除します。

関連する問題