在C中实现通用链表库时的内存管理

时间:2012-08-22 09:39:40

标签: c memory-management linked-list

我正在C

中实现通用链接列表
struct Node
{
  void* data;
  struct Node* next;
};

让用户担心分配和取消分配哪些数据指向或者我们自己应该这样做是否更好?如果留给用户,他们可能会将堆栈对象存储到列表中,这可能会导致以后出现问题。我只是想知道哪种设计更好。

2 个答案:

答案 0 :(得分:4)

一般经验法则 通常是谁分配内存 - 负责释放

在您的情况下,您应该自己照顾节点,用户应该负责data

这是有道理的,因为:

  1. 通过对节点负责 - 它可以让您更自由地在未来版本中更改实现,而无需担心向后兼容性。
  2. 您无法知道如何如果来释放data - 它可能是一个需要在内部字段中释放的复杂类型,或者它可能是指向堆栈分配的空间,如果试图释放它将导致错误。
  3. 此外,请记住,如果用户从中获取了一个元素 列表 - 这并不意味着他想破坏数据。也许吧 list是queue,当前正在处理该元素 他?

答案 1 :(得分: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);
}