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 对象中,并为该对象设置了一个终结过程。终结过程释放了内存,从而消除了内存泄漏。