gpt4 book ai didi

garbage-collection - 我怎样才能让 Lisp 垃圾收集器删除我的类槽中的外部 c++ 分配内存?

转载 作者:行者123 更新时间:2023-12-01 12:19:09 24 4
gpt4 key购买 nike

我的类(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 中有一个终结器的简短示例.您还可以看到一些使用它们的现有项目,例如 cl-sdl2 ,它使用它们来释放 SDL 表面、纹理等。参见 SDL-COLLECT对于设置终结器的位置,以及 CREATE-RGB-SURFACE例如,从哪里调用 SDL-COLLECT

关于garbage-collection - 我怎样才能让 Lisp 垃圾收集器删除我的类槽中的外部 c++ 分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45769064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com