c - 链表删除函数中,删除节点是否需要使用free?

标签 c pointers memory-leaks linked-list singly-linked-list

我看到了this节点删除功能并将其与我的书进行比较。它(几乎)完全不同,我猜后者对学习问题很有用......?但是后来我不明白为什么 free 即使只需要向前移动指针就可以使用。也许我遗漏了什么。

作为引用,这是我的书的删除节点功能:

char delete(ListNodePtr *sPtr, char value){
  if(value == (*sPtr)->data){
    ListNodePtr tempPtr = *sPtr; 
    *sPtr = (*sPtr)->nextPtr; 
    free(tempPtr); 
    return value;
  }
  else{
    ListNodePtr previousPtr = *sPtr;
    ListNodePtr currentPtr = (*sPtr)->nextPtr;

  while(currentPtr != NULL && currentPtr->data != value){
    previousPtr = currentPtr; 
    currentPtr = currentPtr->nextPtr;
  }
  
    if(currentPtr != NULL){
      ListNodePtr tempPtr = currentPtr;
      previousPtr->nextPtr = currentPtr->nextPtr;
      free(tempPtr);
      return value;
    }
  }

  return '\0';
}

我还尝试完全删除临时变量和自由调用,并且函数仍然(显然)有效,因为打印函数不打印“已删除”值。

一直在检查链接列表上的其他来源,其中许多显示了 free 函数的用法,很奇怪。

最佳答案

Linus 描述了在 Linux 内核中使用的列表。一件有趣的事情是那些是侵入式列表,这意味着列表管理代码负责释放节点,因为列表不拥有它们。

此外,该网站上的代码并不是删除节点的完整功能,而只是取消链接的代码。

不过,您自己的列表可能是一个拥有列表,使用 malloc()-ed 内存,对吧?

关于c - 链表删除函数中,删除节点是否需要使用free?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988549/

相关文章:

C:如何存储一个字符串

ios - TWRequest 在非 ARC 项目中使用时似乎会泄漏

c++ - 如何查看NetBeans for C++应用程序中的内存泄漏?

c - 在 C 中打印数组指针中的值

objective-c - CFUUIDBytes 潜在的 iOS 内存泄漏

c - 从C中的文件中读取链表

c - "-bash: gcc: command not found"编译c时使用cygwin?

c - 如何使用双指针释放树结构?

c - 如何将字符串读入空指针?

c++ - 动态结构错误,指针转换