2012-10-25 26 views
0

爲什麼析構函數和複製構造函數對於基於指針的鏈表實現是必需的?我試圖理解它背後的概念以及它是如何工作的。析構函數和鏈表中

+0

http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html這裏有一些信息給你。 – DaveyLaser

+0

你是什麼意思「他們爲什麼需要」?鏈接列表(通常)使用節點的動態分配,並且需要以某種方式清理該內存...... – Yuushi

回答

2

這是一個所有權問題。通常,鏈接列表是作爲節點對象序列實現的,每個節點都有一個指向下一個(以及在雙鏈表的情況下爲前一個)節點的指針。該列表通常包含指向第一個節點的指針。所以當複製列表時,需要執行「深度」複製,否則複製列表最終會指向相同的節點,最終會有兩個對象指向相同的結構。通過創建一個全新的,動態分配的節點序列來執行此深層副本。這是實現複製構造函數的原因。還需要按照類似的邏輯提供賦值運算符(請參閱rule of three)。至於析構函數,由於每個列表都擁有其節點,並且已經動態分配它們,它必須在銷燬時釋放資源。

總結:

  1. 節點包含指針(或智能指針)節點,因爲他們不能持有節點對象(無限循環)。
  2. 列表(應該)保存自己的節點序列,不與其他列表共享它們。這導致了複製和分配上的動態分配。
  3. 由於他們管理動態分配的資源,列表必須在其生命週期結束時清理這些資源。這導致析構函數(除非智能指針已被使用)。
2

典型的實現將使用new從堆中分配內存。如果您想在不再需要對象時釋放該內存,則必須編寫一個析構函數,該列表中的其餘節點將釋放內存。