Common Lisp/超越 ANSI Common Lisp/使用者控制 GC
外觀
Common Lisp 規範對垃圾回收(GC)的描述很少。GC 通常被視為一個黑盒子,使用者無需擔心:如果一個物件是可訪問的,那麼它仍然被分配,因此不會出現記憶體錯誤。但是,有時控制垃圾回收和記憶體管理會很有用。幾乎每個 Common Lisp 實現都包含一個名為 GC 的函式,用於啟動垃圾回收過程。GC 是相當標準的,但其他功能(如弱指標、弱雜湊和物件終結)的介面就不那麼標準了,甚至可能不存在。我們將使用相容層 trivial-garbage 來提供一個標準的介面。
當 GC 回收一個物件時,空間通常會直接被釋放。然而,在某些情況下,在垃圾收集器回收資料時執行一個過程可能很有用。物件終結(不要與類終結混淆)允許您設定這樣的過程。
您可能想要使用它的一個例子是當您分配外部記憶體(不受垃圾收集器控制的記憶體)時。終結允許您將該記憶體置於垃圾收集器的控制之下。
(defun get-foreign-array (size) ...
(tg:finalize ...))
我們將外部指標封裝在 Lisp 物件中,併為該物件設定了一個終結過程。終結過程釋放了記憶體,從而消除了記憶體洩漏。