BaysideLizard 发表于 2023-11-29 22:35:17

接上一个提问,来自《带你学C带你飞》S1E46:单链表2

上一个提问:https://fishc.com.cn/thread-237095-1-1.html
上一个内容:
https://pic.ziyuan.wang/2023/11/29/guest_1cc095b3dab71.jpg
来自《带你学C带你飞》S1E45:单链表1
小甲鱼犯了什么错误了?

我认为的最佳回答:

柿子饼同学 的回答:
你先执行 free 了 , 相当于这本书已经不存在了 , 怎么再找到被删除的这本书的后继呢

应该是用一个临时指针 temp 指向现在的这本书
然后 library = library->next
然后 free(temp)
酱紫先跳到这本书的下一本 , 然后把这一本删除才对


感谢柿子饼同学回复,小甲鱼在下一节课的开头也说了这个问题,但是他把Library换成了指针的指针传进来,为什么一定要传Library的地址进来呢,不能还是传值吗?
这是小甲鱼的修改代码
https://pic.ziyuan.wang/2023/11/29/guest_22cae05092feb.jpg
这是我的修改代码
void releaseLibrary(struct Book *headLibrary)
{
    struct Book *temp;
    while(headLibrary != NULL)
    {
      temp = headLibrary;
      headLibrary = headLibrary->next;
      free(temp);
    }
}

FishC_GPT 发表于 2023-11-29 22:35:34

传递指针的指针是为了能够修改指针本身的值,从而达到在函数内部修改指针的目的。如果只传递指针的值,函数内部对指针的修改不会影响到外部的指针。

在这个问题中,小甲鱼传递指针的指针是为了能够在函数内部将头指针(headLibrary)置为NULL,以表示链表已经被释放。这样做的好处是,当函数返回后,调用者可以通过检查头指针是否为NULL来确定链表是否已经被释放。而如果只传递指针的值,函数内部对指针的修改并不能影响到调用者。

你的修改代码中,传递指针的值也是可以实现释放链表的功能的。但是需要注意,在函数内部释放指针时,不能直接将指针置为NULL,因为这样做只会修改函数内的指针副本。为了能够修改外部的指针值,你需要在函数返回之前,手动将外部指针置为NULL。

总结起来,传递指针的指针可以更方便地释放链表,并且在函数返回后能够及时反馈链表被释放的状态,但传递指针的值也是可以实现相同功能的,只需要在函数返回之前手动将指针置为NULL即可。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

BaysideLizard 发表于 2023-11-29 22:53:42

FishC_GPT 发表于 2023-11-29 22:35
传递指针的指针是为了能够修改指针本身的值,从而达到在函数内部修改指针的目的。如果只传递指针的值,函数 ...

但是释放完了以后程序就结束了,把头指针置为NULL是不是也无所谓了。
还有一个问题:如果我不对单链表进行手动free,那程序结束以后会自动free吗?

FishC_GPT 发表于 2023-11-29 22:53:56

BaysideLizard 发表于 2023-11-29 22:53
但是释放完了以后程序就结束了,把头指针置为NULL是不 ...

是的,如果程序结束后,操作系统会自动回收所有未释放的内存资源,包括单链表所占用的内存。因此,如果你没有手动释放单链表的内存,在程序结束时,操作系统会自动释放这些内存。

然而,推荐在程序中手动释放动态分配的内存,特别是在长时间运行的程序或者内存使用较大的程序中。这样可以确保及时释放不再使用的内存,减少内存的泄漏问题,并提高程序的性能。

在释放单链表时,需要遍历链表,逐个释放每个节点的内存。如果使用`malloc`函数为节点分配了内存,那么应该使用`free`函数来释放内存。如果使用`calloc`函数或者`realloc`函数为节点分配了内存,那么应该使用`free`函数来释放内存。

总结一下,尽管程序结束时会自动释放单链表所占用的内存,但最好还是养成良好的编程习惯,在不再使用某个动态分配的内存时,手动释放它们,以防止内存泄漏问题的出现。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

BaysideLizard 发表于 2023-11-29 22:56:38

FishC_GPT 发表于 2023-11-29 22:53
是的,如果程序结束后,操作系统会自动回收所有未释放的内存资源,包括单链表所占用的内存。因此,如果你 ...

什么是内存泄漏?

FishC_GPT 发表于 2023-11-29 22:57:01

BaysideLizard 发表于 2023-11-29 22:56
什么是内存泄漏?

内存泄漏指的是在程序中分配了内存空间,但在不再需要使用这些内存空间时,没有正确地释放它们。也就是说,当你无法再访问或使用某个内存空间时,却没有将其还给操作系统,造成内存无法被回收的情况,从而导致程序占用的内存逐渐增加,最终可能导致系统资源耗尽。

内存泄漏通常发生在动态分配内存的场景中,例如使用 `malloc`、`calloc` 或 `new` 在堆上分配内存。如果在使用完内存之后没有调用对应的释放内存的函数(例如 `free`、`delete`),那么这块内存将永远无法被回收,造成内存泄漏。

内存泄漏可能会导致程序运行速度变慢,甚至崩溃。尤其是在长时间运行的程序、循环执行的程序或大量使用动态内存分配的程序中,内存泄漏问题会对性能和可靠性产生严重影响。

为了避免内存泄漏,需要确保在不再需要使用动态分配的内存时,及时调用相应的释放函数进行内存释放。同时,编写良好的代码结构和内存管理策略,并使用一些工具和技术(如内存分析工具、智能指针等)来帮助检测和避免内存泄漏问题的发生。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

BaysideLizard 发表于 2023-11-29 23:06:47

FishC_GPT 发表于 2023-11-29 22:57
内存泄漏指的是在程序中分配了内存空间,但在不再需要使用这些内存空间时,没有正确地释放它们。也就是说 ...

感谢你的回复 : )

FishC_GPT 发表于 2023-11-29 23:06:56

BaysideLizard 发表于 2023-11-29 23:06
感谢你的回复 : )

不客气,我很高兴能够帮助到您!如果您有任何其他问题或需要进一步的解答,请随时告诉我。我将尽力为您提供帮助。祝您编程学习顺利!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 接上一个提问,来自《带你学C带你飞》S1E46:单链表2