2012-08-22 30 views
1

我执行在C通用链表内存管理,同时实现用C

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

是更好地让有关分配和释放用户担心什么数据将指向一个通用的链表库,或我们应该自己做吗?如果留给用户,他们可能会将堆栈对象存储到列表中,以后可能会导致问题。我只是想知道哪种设计更好。

+0

首先不要使用'void *'。 –

+3

@EdHeal - 为什么不呢? –

+0

用户可能想要存储堆栈对象,为什么不呢。或者是静态的。 – nshy

回答

4

拇指的一般规则是通常谁分配内存 - 负责释放它

就你而言,你应该照顾自己的节点,用户应该负责data

这是有道理的,因为:

  1. 通过采取在节点 - 责任,它给你更多的自由来改变未来的版本中实现,而无需担心其向后兼容性。
  2. 你无法知道如何如果释放data - 它可能是一个复杂的类型,需要在内部领域释放为好,或者它可能如果试图将指向堆栈中分配空间,这将导致错误释放它。
  3. 另外,请记住,如果用户从 列表中删除了一个元素 - 这并不意味着他想销毁数据。也许 列表是一个queue,并且他正在处理该元素 他?
+0

这就是我正在寻找的......尝试使用alloc-dealloc用户提供的数据的其他潜在危险? –

+0

@ user1616513:主要的问题是,它可能指向一个内存,你不能预期错误/未定义的行为(我可以得到的一些例子是:指向自动分配的变量,指向字符串文字的指针,...) – amit

+0

@ Samhan另外:我增加了另一个原因:如果一个元素不在列表中 - 这并不意味着数据不再需要。 – amit