垃圾回收
內存清理的另一個方面是垃圾回收。在支持垃圾回收的環境中,程序員幾乎不必顯式地釋放與對象關聯的
內存。運行時庫會在某時刻自動清理沒有任何引用的對象。
與C#和Java不一樣,在C++語言中沒有內建垃圾回收。在現代C++中,使用智能指針管理內存,在舊代
碼中,則在對象層次通過new和delete管理內存。諸如shared_ptr的智能指針(稍后討論)提供類似于“垃圾回收
后的內存”的功能,也就是說,銷毀某資源的最新shared_ptr實例時,會同時銷毀資源。在C++中實現真正的
垃圾回收是可能的,但不容易,而將自己從釋放內存的任務中解放出來可能引入新麻煩。
標記(mark)和清掃(sweep)是一種垃圾回收的方法。使用這種方法的垃圾回收器定期檢查程序中的每個指
針,并將指針引用的內存標記為仍在使用。在每一輪周期結束時,未標記的內存視為沒有在使用,因而被釋放。
如果愿意執行以下操作,那么可以在C++中實現標記和清掃算法:
(1) 在垃圾回收器中注冊所有指針,這樣垃圾回收器可輕松遍歷所有指針。
(2) 讓所有對象都從一個混入類中派生,這個混入類可能是GaibageCollectible,允許垃圾回收器將對象標
記為正在使用中。
(3) 確保在垃圾回收器運行時不能修改指針,從而保護對象的并發訪問。
可以看出,這種垃圾回收方法需要程序員付出很多努力,甚至可能比使用delete更容易出錯!人們己經嘗
試在C++中實現安全簡單的垃圾回收機制,’但是就算C++中出現了完美的垃圾回收機制,也不一定適用于所有
應用程序。垃圾回收存在以下缺點:
?當垃圾回收器正在運行時,程序可能停止響應。
?使用垃圾回收器時,析構函數具有不確定性。由于對象在被垃圾回收之前不會銷毀,因此對象離開作
用域時不會立即執行析構函數。這意味著,由析構函數完成的資源清理操作(如關閉文件、釋放鎖等)
要在將來某個不確定的時刻進行。
編寫一個垃圾回收機制是很難的。你無疑會犯錯,因為它容易出錯,而且很可能會降低運行速度