背景
我有以下代码
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)
。
假设我传递给FileDesc
的{{1}}是列表的最后一个条目。
FD_Remove
因此我们可以假设现在释放了具有FD_Remove(FDescList, 0x00000005);
实体的内存。
现在我致电0x00000005
我只假设这些值会出现在Linked-list中以前释放的实体中。
问题
问题是实体设置为FD_Add(FDescList, FileDesc, 'whatever');
而不是释放内存,并且该功能会添加NULL
和'无论什么'在FileDesc
内存块之后而不是在其内部的实体数据。
问题
我在导致此问题的NULL
函数中出错了什么,以及如何改进我的功能来解决此问题?
答案 0 :(得分: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);