2017-12-24 26 views
-3

私はリストを解放したいが、私は間違っていたと思う。削除しても到達可能なメモリブロックがあるからだ。ランダムなポインタでリンクリストを削除するにはどうしたらいいですか?

typedef struct TEmployee 
{ 
    struct TEmployee   * m_Next; 
    struct TEmployee   * m_Bak;//random pointer 
    char      * m_Name; 
} TEMPLOYEE; 




void freeList (TEMPLOYEE * src) { 

    while (src) { 
     TEmployee * tmp = src ; 
     free(src->m_Name); 
     src = src -> m_Next ; 
     free (tmp) ; 
    } 
} 
+0

_あなたがこれを証明ましたか_「私は到達可能なメモリ・ブロックを持っています」 ? – user0042

+0

私はデバッガを使って確認しましたが、わかりません。 –

+1

'free()'が呼び出された後、これらのポインタを間接参照することは_undefined behavior_です。 – user0042

答えて

1

あなたはあなたのリストの先頭へのポインタでfreeListを呼び出していると仮定すると、あなたのリストが正しく解放されます。

srcがリスト内の最初の要素(ただし、リスト内のランダム要素)を指していない場合は、m_Backを使用してリスト内の最初の要素に戻り、ループを実行しますそれを解放する。あなたの観察(「私は到達可能なメモリ・ブロックを持っている」)について

あなたが到達可能なメモリ・ブロックを持っていると思う理由は、ある理由は必ずしもメモリの内容自体は変更されません割り当てられたメモリを解放します。つまり、割り当てられている間にリストに保存されたデータは、メモリを解放した後でもそこに存在することができます(当然それに依存することはできません)。

0

と入力した場合は)リスト内の最初の要素へのポインタを使用して関数を呼び出すと、関数は正しくなります。

あなたが行うことができ、リスト内の任意の要素へのポインタで呼び出されたときに、関数はリスト全体を解放したい場合:

void freeList (TEMPLOYEE * src) 
{ 
    if (src) 
    { 
     TEmployee* tmp1; 

     // Free elements after src 
     tmp1 = src->m_Next; 
     while (tmp1) 
     { 
      TEmployee* tmp2=tmp1; 
      free(tmp1->m_Name); 
      tmp1 = tmp1->m_Next; 
      free(tmp2); 
     } 

     // Free elements before src 
     tmp1 = src->m_Bak; 
     while (tmp1) 
     { 
      TEmployee* tmp2=tmp1; 
      free(tmp1->m_Name); 
      tmp1 = tmp1->m_Bak; 
      free(tmp2); 
     } 

     // Free src 
     free(src->m_Name); 
     free(src); 
    } 
} 
関連する問題