我正在C
中实现通用链接列表struct Node
{
void* data;
struct Node* next;
};
让用户担心分配和取消分配哪些数据指向或者我们自己应该这样做是否更好?如果留给用户,他们可能会将堆栈对象存储到列表中,这可能会导致以后出现问题。我只是想知道哪种设计更好。
答案 0 :(得分:4)
一般经验法则 通常是:谁分配内存 - 负责释放。
在您的情况下,您应该自己照顾节点,用户应该负责data
。
这是有道理的,因为:
data
- 它可能是一个需要在内部字段中释放的复杂类型,或者它可能是指向堆栈分配的空间,如果试图释放它将导致错误。答案 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);
}