HintergrundSingly Linked-List (Wie man richtig entfernen/eine Einheit befreien?)
Ich habe den folgenden Code
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;
}
}
Hinweise
Grundsätzlich, wenn ich schaffe ein neuer Eintrag in der verknüpften Liste. Ich werde einen neuen Speicherblock der gegebenen Strukturgröße zuweisen und ihn an das Ende der Liste setzen, um einen Block auf die gleiche Weise wie in dieser _Remove
Funktion zu finden.
Allerdings, wenn ich versuche, eine Entität zu entfernen. Ich lösche die Entität von der Liste, wie oben gezeigt, und setze die aktuelle Entität auf den nächsten Eintrag in der Liste. Das Problem ist, dass der LocalFree
-Aufruf den zugewiesenen Speicher nicht tatsächlich auf einen nicht zugeordneten Speicherblock zurücksetzt. Wenn ich auf die verknüpfte Liste schaue, sind in der aktuellen Entity einfach alle Einträge auf NULL (0)
gesetzt.
Angenommen, die FileDesc
, die ich an FD_Remove
übergebe, ist der letzte Eintrag der Liste.
FD_Remove(FDescList, 0x00000005);
So können wir davon ausgehen, dass der Speicher, der die 0x00000005
Einheit hat nun befreit.
Jetzt nenne ich FD_Add(FDescList, FileDesc, 'whatever');
würde ich nur annehmen, dass diese Werte in der zuvor befreit Einheit in der Linked-Liste erscheinen würden.
Problem
Das Problem ist, dass Einheit NULL
anstelle von freigegebenen Speicher gesetzt ist, und die Funktion fügt die FileDesc
und ‚unabhängig‘ Daten an die Einheit nach dem NULL
Speicherblock anstelle des im Inneren davon.
Frage
Was bin ich in meiner FD_Remove
Funktion falsch zu machen, dass dies verursacht, und wie kann ich meine Funktion verbessern, dieses Problem zu beheben?