2016-10-09 6 views
0

ノードを使用してリストコンテナを作成しています。次のノードポインタにアクセスするとC++がクラッシュする

これはノード構造の外観です。 mFirstは、リストクラスのプライベートデータメンバーです。

struct Node{ 
    Node(const EType & d, Node *n = nullptr) : mData(d), mNext(n) { } 
    EType mData; 
    Node *mNext;   
}; 
Node *mFirst; 

コンテナから要素を削除するための関数があります。

この問題は、オンラインで発生します。temp2->mNext = temp->mNext;

要素は削除されますが、プログラムがクラッシュします。

問題の原因は何もわかりません。

template <typename EType> 
void Set<EType>::remove(const EType & x) { 
    if (isElement(x)) { 
     Node *temp = mFirst; 
     Node *temp2 = nullptr; 
     while(temp->mData != x) { 
      temp2 = temp; 
      temp = temp->mNext; 
     } 
     if (temp2 == nullptr) { 
      mFirst = temp->mNext; 
     } else { 
      temp2->mNext = temp->mNext; 
     } 
    } 
} 

私は行を変更した場合:

temp = temp->mNext; 
temp2 = temp2->mNext; 
temp2 = temp; 

何も起こらない、と機能が動作しません。

両方の式が同じではありませんか?

+0

'プログラムはクラッシュするでしょう。 'remove'メソッドは、' remove'の中で 'isElement'メソッドをマージして、それらの使用から離れたアサーションを避けることができたとしても正しいと思われます。 'mFirst'や' temp2-> mNext'は削除していないことに注意してください。 – Franck

+0

デバッガを使って、問題の行で何が起きているか把握しようとすると、 'temp2'または' temp'が 'nullptr'であるか、' temp2'と 'temp'をコンソールに出力してそれらは 'nullptr'です。次に、それが起こる条件の下で理解しようとします。そして、あなたはあなたの問題をデバッグします。 – igagis

答えて

0

使用するすべてのポインタについて、0と異なるかどうかをチェックする必要があります:tmp2だけをチェックしますが、tmpもチェックする必要があります。

あなたはまた、リストを作成するときに注意を払う必要がある要素がリストに

if(tmp) 
{ 
    if(!tmp2) 
    { 
    mFirst = tmp->mNext; 
    delete tmp;//now it is deleted 
    } 
    else 
    { 
    tmp2->mNext = tmp->mNext; 
    delete tmp;//now it is deleted 
    } 

を発見されたかどうかを確認する必要があり

while(tmp && tmp->mData !=x) 

:最後の要素はmNextが0

0
に設定されている必要があります

まずは、あなたは最後のコードは何もしません。もう一度読む。
ループ内であってもリストの最後をチェックすることは決してありません。
要素が削除されたことをどのように知っていますか?プログラムがこの行でクラッシュした場合、何も削除されません。
そして、私は削除を見ないので、あなたはオブジェクトを削除するつもりはない、それはまだメモリにあります。
正確なクラッシュメッセージを教えていただけますか?おそらくgdbを使用すると

+0

プログラムが実行され、クラッシュします。要素を削除した後にprint()を実行したので、プログラムが終了する前に要素がなくなっているのがわかりました。プログラムを正しく実行することさえできなかったので、私はオブジェクトを削除することに悩まされませんでした。 –

+0

これはちょうど***。cppが動作を停止したことを示しています.... –

+0

この機能がクラッシュを引き起こしているかどうかはわかりません。デバッガを使ってコードを実行しようとすると、クラッシュに関する詳細情報が得られるはずです。 –

関連する問題