背景、単一リンクの-一覧(どのように適切にフリー/エンティティを削除するには?)
私は、次のコードを持っている
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
機能で間違って何をやっているし、どのように私はこの問題を解決するために、私の機能を向上させることができますか?