2012-08-22 32 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