gpt4 book ai didi

c - 链表包含其他链表 & 免费

转载 作者:太空狗 更新时间:2023-10-29 17:02:42 25 4
gpt4 key购买 nike

我有一个通用链表实现,其中包含一个指向数据的 void* 的节点结构和一个包含对头的引用的列表结构。现在这是我的问题,链表中的一个节点可能通过其 void* 持有对另一个链表的引用。当我释放包含较小列表的较大列表时,这会导致内存泄漏。所以我想知道是否有一种方法可以检查 void* 是否指向另一个列表,所以我也关注并释放它或仅指向数据。

如果我在我的结构的开头添加一个键,我可以通过取消引用 void* 来检查它并确定它是一个列表?

编辑:调用者不插入较小的列表,它们是由我的函数插入的我不希望调用者只处理他们持有指针的多个列表。

最佳答案

这个问题实际上取决于谁负责清理列表中的条目。如果您的结构负责清理由 void * 字段引用的内存,那么您手头的问题就大得多,即给定一个 void * 引用一些任意内存块,您永远无法知道释放它的正确方法是什么。例如,如果您根据 C++ std::vector 实现了一个动态数组,那么您的 void * 可能指向一个结构,该结构本身包含一个指针,并且您的列表将需要知道它必须下降到该结构以递归释放其动态分配的 block 。您所描述的情况,即您泄漏嵌套列表的情况 - 只是这个更普遍问题的特例。

另一方面,如果列表不负责清理它存储的 void * 引用的内存,那么您根本不必担心这个问题。

如果您的列表确实具有所有权语义并且需要清理存储在其中的元素的内存,我强烈建议您不要使用魔数(Magic Number)来确定您是否有嵌套列表。相反,您可能应该让客户端为您提供一个包含释放例程的函数指针,以在插入到列表中的元素上运行。这样,您的代码就可以使用用户提供的清理代码来确保清理存储在列表中的任何元素。

关于c - 链表包含其他链表 & 免费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com