1

我正在用 C 实现一个通用的链表

struct Node
{
  void* data;
  struct Node* next;
};

让用户担心分配和释放数据将指向什么更好,还是我们应该自己做?如果留给用户,他们可能会将堆栈对象存储到列表中,这可能会在以后引起问题。我只是想知道哪种设计更好。

4

2 回答 2

4

一般的经验法则通常谁分配内存——负责释放它

在您的情况下,您应该注意节点本身,并且用户应该对data.

这是有道理的,因为:

  1. 通过对节点负责 - 它使您可以更自由地更改未来版本的实现,而无需担心向后兼容性。
  2. 您不知道如何以及是否要释放data- 它可能是一个复杂类型,也需要在内部字段中释放,或者它可能指向堆栈分配的空间,如果尝试释放它会导致错误。
  3. 此外,请记住,如果用户从列表中取出一个元素 - 这并不意味着他想要销毁数据。也许列表是一个队列,并且该元素当前正在由他处理?
于 2012-08-22T09:43:57.137 回答
0

您还可以创建一个函数,该函数采用函数指针和数据类型在通用链接列表中释放。用户可以在函数中提供自定义代码并将指针传递给该函数以执行他们的代码版本以释放复杂数据类型中分配的内存,例如需要遍历的嵌套结构或具有多个指针变量的结构需要也被解除分配。以下是这个想法的一个片段。主程序

int int_data;  /* int can be replaced by any other data type */
deallocate_data(user_defined_free, &int_data);

void user_defined_free(void *data)
{
    int *i = (int *)data;    
    /* cast to your data type and 
     perform deallocation */
}

在您的通用链表代码中的某处

void deallocate_data (void (*p)(void *), void *data)
{
  /* call user defined function to free their data structure */
    p(data);
}
于 2021-06-09T20:30:31.197 回答