Ham*_*aya 8 c pointers linked-list void-pointers data-structures
我有一个通用链表实现,其中包含一个包含void*to data的节点结构和一个包含对head的引用的list结构.现在这是我的问题,链表中的节点可以通过其void*保存对另一个链表的引用.当我释放包含较小列表的较大列表时,这会导致内存泄漏.所以我想知道有没有办法检查void*是否指向另一个列表所以我跟随并释放它也只是数据.
如果我在我的struct的开头添加一个关键字,我可以通过解除引用void*来检查并找出它是一个列表?
编辑:调用者不插入我的函数插入的较小列表我不希望调用者处理重定位多个列表只是他们持有指针的列表.
这个问题实际上取决于清理列表中的条目的责任.如果你的结构负责清理void *
字段引用的内存,那么你手头有一个更大的问题,即给定一个void *
任意的内存块,你永远不知道解除分配的正确方法是什么.例如,如果你有一个沿着C++行的动态数组的实现std::vector
,那么你void *
可能指向一个本身包含指针的结构,你的列表需要知道它必须下降到该结构中以递归释放动态分配的块.您正在描述的情况,即泄漏嵌套列表的情况 - 只是这个更一般问题的一个特例.
另一方面,如果列表不负责清理void *
它存储的s所引用的内存,那么你根本不应该担心这个问题.
如果您的列表确实具有所有权语义并且需要清理存储在其中的元素的内存,我强烈建议您不要使用幻数来确定您是否有嵌套列表.相反,您应该让客户端为您提供一个函数指针,其中包含一个释放例程,以便在插入到列表中的元素上运行.这样,您的代码可以使用用户提供的清理代码来确保清除列表中存储的所有元素.