2017-12-20 5 views
1

背景、単一リンクの-一覧(どのように適切にフリー/エンティティを削除するには?)

私は、次のコードを持っている

VOID FD_Remove(FDescs List, PVOID FileDesc) { 
    while (List) { 
     if (List->Sock == FileDesc) { 
      List->Next = (FDescs) LocalAlloc(sizeof(Network::FDesc)); 
      if (List->Next != ERROR) { 
       FDescs Element = List->Next; 

       List->Sock = List->Next->Sock; 
       List->Host = List->Next->Host; 
       List->Path = List->Next->Path; 

       List->Next = Element->Next; 
       LocalFree(Element); 
      } 
     } List = List->Next; 
    } 
} 

ノート

基本的に、私が作成していたときにリンクされたリストの新しいエントリ。与えられた構造体サイズの新しいメモリブロックを割り当て、リストの末尾に設定して、この_Remove関数と同じ方法でブロックを探します。

ただし、エンティティを削除しようとしています。上記のようにリストからエンティティを解放し、現在のエンティティをリストの次のエントリに設定します。問題は、LocalFreeコールが割り当てられたメモリを実際に割り当てられていないメモリブロックに戻さないということです。リンクリストを見ると、現在のエンティティはすべてのエントリがNULL (0)に設定されています。

FD_Removeに渡しているFileDescをリストの最後のエントリとします。

FD_Remove(FDescList, 0x00000005);

だから我々は0x00000005実体を持っているメモリが今解放されると仮定することができます。

今、私は私が唯一のこれらの値は、リンクされたリストには、以前に解放されたエンティティに表示されることを前提としていますFD_Add(FDescList, FileDesc, 'whatever');

を呼び出します。

問題

は問題は実体が代わりに解放されたメモリのNULLに設定されていることで、機能はNULLメモリブロックの代わりに、その内側の後エンティティにFileDescと「何のデータを追加します。

質問

私はこれを引き起こしている私のFD_Remove機能で間違って何をやっているし、どのように私はこの問題を解決するために、私の機能を向上させることができますか?

答えて

2

リンクされたリストから要素を削除するには、単に削除する要素への周囲の要素ポインタを更新してから要素を解放するだけです。何かを割り当てたりコピーしたりする必要はありません。

VOID FD_Remove(FDescs List, PVOID FileDesc) { 
    FDescs Previous = NULL; 
    while (List) { 
     if (List->FDesc == FileDesc) { 
      if (Previous) 
       Previous->Next = List->Next; 
      LocalFree(List); 
      return; 
     } 
     Previous = List; 
     List = List->Next; 
    } 
} 

FD_Remove(FDescList, (PVOID)0x00000005); 

しかし、削除される要素は、あなたのリンクリストのheadある場合に気を付ける:

ではなく、これを試してみてください。もしそうなら、上記の関数が直接行うことができないポインタも更新する必要があります。代わりに次のようにする必要があります。

VOID FD_Remove(FDescs *List, PVOID FileDesc) { 
    if (!List) return; 
    FDescs Element = *List, Previous = NULL; 
    while (Element) { 
     if (Element->FDesc == FileDesc) { 
      if (*List == Element) 
       *List = Element->Next; 
      if (Previous) 
       Previous->Next = Element->Next; 
      LocalFree(Element); 
      return; 
     } 
     Previous = Element; 
     Element = Element->Next; 
    } 
} 

FD_Remove(&FDescList, (PVOID)0x00000005); 
関連する問題