garbage-collection - 如何完成 lisp:struct 包含指针?
问题描述
我正在将轻量级通信和编组从 julia 移植到 lisp,因为它具有更好的 API。我使用swig生成 C 函数调用。
我想知道这是否是 C 指针的安全用法。这是创建功能:
(defun create-lcm (&optional (provider (null-pointer)))
(let* ((ptr (lcm_create provider))
(addr (cffi:pointer-address ptr)))
(tg:finalize ptr (lambda () (lcm_destroy (cffi:make-pointer addr))))
(if (NULL-POINTER-P ptr)
(error "lcm creation error"))
(%create-lcm :pointer ptr :provider provider
:file-descriptor (lcm_get_fileno ptr))))
问题:
- 完成 C 指针的正确方法是什么?
- 如何为此进行测试?
欢迎任何其他注释/建议。
提前致谢。
解决方案
以下是一些错误的事情:
- 将终结器附加到可能为空的指针
- 我不确定您是否可以将终结器附加到外部指针。也许你是。
- 你需要小心终结器和 gc。如果终结器引用它终结的对象,则对象及其终结器彼此保持活动状态(它们不能立即收集,因为终结器可能会在某处存储对该对象的引用,然后该对象将处于活动状态,因此应该t 已定稿。
我不知道这是否正确,但更好:
(defun create-lcm (&optional (provider (null-pointer))
(let ((ptr (lcm_create provider)))
(when (null-pointer-p ptr)
(error “lcm creation error”))
(flet ((finaliser () (lcm_destroy ptr)))
(let ((result (%create-lcm :pointer ptr :provider provider
:file-descriptor (lcm_get_fileno ptr))))
(tg:finalize result #'finaliser)
result))))
以下是一些错误的事情:
- 如果出现错误,
%create-lcm
则lcm_get_fileno
终结器将不会运行
推荐阅读
- php - 如何从表单请求中删除请求参数
- html - 如何将 div 的背景更改为 HTML 中的图像?
- java - 类路径中的“.:./*”是什么意思?
- angular - Angular:使用 ViewChild 访问孙子和嵌套组件方法
- javascript - React map() 显示未定义
- gradle - gradle如何排除重复的资源文件?
- ruby-on-rails - Rails:jQuery ajax() 正在返回所有 html
- python - 使用时间戳对 Python 字典列表进行排序
- javascript - 在 Flutter 中构建 d3.js 小部件
- javascript - 引导表 Javascript 总和变成 NaN?