爲什麼析構函數和複製構造函數對於基於指針的鏈表實現是必需的?我試圖理解它背後的概念以及它是如何工作的。析構函數和鏈表中
Q
析構函數和鏈表中
0
A
回答
2
這是一個所有權問題。通常,鏈接列表是作爲節點對象序列實現的,每個節點都有一個指向下一個(以及在雙鏈表的情況下爲前一個)節點的指針。該列表通常包含指向第一個節點的指針。所以當複製列表時,需要執行「深度」複製,否則複製列表最終會指向相同的節點,最終會有兩個對象指向相同的結構。通過創建一個全新的,動態分配的節點序列來執行此深層副本。這是實現複製構造函數的原因。還需要按照類似的邏輯提供賦值運算符(請參閱rule of three)。至於析構函數,由於每個列表都擁有其節點,並且已經動態分配它們,它必須在銷燬時釋放資源。
總結:
- 節點包含指針(或智能指針)節點,因爲他們不能持有節點對象(無限循環)。
- 列表(應該)保存自己的節點序列,不與其他列表共享它們。這導致了複製和分配上的動態分配。
- 由於他們管理動態分配的資源,列表必須在其生命週期結束時清理這些資源。這導致析構函數(除非智能指針已被使用)。
2
典型的實現將使用new
從堆中分配內存。如果您想在不再需要對象時釋放該內存,則必須編寫一個析構函數,該列表中的其餘節點將釋放內存。
相關問題
- 1. 析構函數的鏈表
- 2. 2d鏈接列表析構函數
- 3. 鏈接列表析構函數
- 4. 鏈表節點的析構函數
- 5. 結構和析構函數
- 6. 構造函數和析構函數
- 7. 構造函數和析構函數 - C++
- 8. 析構函數和構造函數
- 9. 鏈接列表和構造函數
- 10. 在鏈表中,析構函數刪除了哪些節點?
- 11. 堆和類析構函數
- 12. 析構函數和python
- 13. std :: vector :: clear()在構造函數和析構函數中
- 14. C++ 2構造函數和類中的析構函數
- 15. C++中構造函數和析構函數的內聯使用
- 16. C++中的構造函數和析構函數與C#比較
- 17. C中的析構函數和構造函數C
- 18. C++中的析構函數和繼承?
- 19. C++中構造函數,複製構造函數,析構函數序列中的額外析構函數
- 20. 在C++中,構造函數和析構函數可以是內聯函數嗎?
- 21. 具有鏈接列表成員的對象的析構函數
- 22. 鏈接列表析構函數無法正常工作
- 23. 是鏈表,樹等的遞歸析構函數嗎?
- 24. 鏈接列表析構函數崩潰C++程序
- 25. 「無法解析的外部符號public _thiscall」鏈接器錯誤調用構造函數和析構函數
- 26. C++ - 虛擬析構函數和鏈接錯誤
- 27. Qt4中的析構函數
- 28. C中的析構函數#
- 29. C++中的析構函數
- 30. Asp.net中的析構函數
http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html這裏有一些信息給你。 – DaveyLaser
你是什麼意思「他們爲什麼需要」?鏈接列表(通常)使用節點的動態分配,並且需要以某種方式清理該內存...... – Yuushi