我怎样才能让 Lisp 垃圾收集器删除我的 class 插槽中的外部 c++ 分配内存?
How can I get the Lisp garbage collector to remove foreign c++ allocated memory in my class slots?
我的 class 看起来像这样:
(defclass matrix ()
((rows :initarg :rows :initform 2)
(cols :initarg :cols :initform 2)
(matrix :accessor matrix)))
我有一个专门的初始化实例方法,它通过调用 c++ 库为矩阵槽创建对象。我有一个矩阵销毁函数,它将释放在 C++ 中分配的内存。
我想要的是能够让垃圾收集器在矩阵槽上调用matrix-destroy。在普通的 lisp 中有没有一种惯用的方法来做到这一点?
为了在垃圾收集器收集到一个对象后运行一个函数,您需要为该对象设置一个终结器。 Common Lisp 标准不包括终结器,但实现确实提供了它们。有一个名为 Trivial Garbage 的兼容性库,您可以使用它来方便地设置它们。
设置终结器只需在要附加终结器的对象上调用 FINALIZE
即可。终结器函数不得包含对对象本身的任何引用,因为那样会阻止它被收集。您还应该记住,终结器可能在任何线程中随时执行,因此它应该是可重入的并且不依赖于任何特定的动态环境。
SBCL 手册在 7.4 Garbage Collection. You can also see some existing project that uses them, such as cl-sdl2, which uses them to free SDL surfaces, textures and such. See SDL-COLLECT
for where the finalizer is set, and CREATE-RGB-SURFACE
中有一个简短的终结器示例,用于说明从何处调用 SDL-COLLECT
。
我的 class 看起来像这样:
(defclass matrix ()
((rows :initarg :rows :initform 2)
(cols :initarg :cols :initform 2)
(matrix :accessor matrix)))
我有一个专门的初始化实例方法,它通过调用 c++ 库为矩阵槽创建对象。我有一个矩阵销毁函数,它将释放在 C++ 中分配的内存。
我想要的是能够让垃圾收集器在矩阵槽上调用matrix-destroy。在普通的 lisp 中有没有一种惯用的方法来做到这一点?
为了在垃圾收集器收集到一个对象后运行一个函数,您需要为该对象设置一个终结器。 Common Lisp 标准不包括终结器,但实现确实提供了它们。有一个名为 Trivial Garbage 的兼容性库,您可以使用它来方便地设置它们。
设置终结器只需在要附加终结器的对象上调用 FINALIZE
即可。终结器函数不得包含对对象本身的任何引用,因为那样会阻止它被收集。您还应该记住,终结器可能在任何线程中随时执行,因此它应该是可重入的并且不依赖于任何特定的动态环境。
SBCL 手册在 7.4 Garbage Collection. You can also see some existing project that uses them, such as cl-sdl2, which uses them to free SDL surfaces, textures and such. See SDL-COLLECT
for where the finalizer is set, and CREATE-RGB-SURFACE
中有一个简短的终结器示例,用于说明从何处调用 SDL-COLLECT
。