首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何最后确定lisp:struct包含指针?

如何最后确定lisp:struct包含指针?
EN

Stack Overflow用户
提问于 2018-08-05 15:56:54
回答 2查看 270关注 0票数 3

我将轻量级通信和编组从朱莉娅移植到lisp,因为它有一个更好的API。我使用大口来生成C函数调用。

我想知道这是否是C指针的安全使用。以下是create函数:

代码语言:javascript
复制
(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指针的正确方法是什么?
  • 怎么做个测试呢?

欢迎您提出任何其他意见。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-06 09:06:31

以下是一些错误的地方:

  1. 将终结器附加到可能为null的指针
  2. 我不确定你能不能把一个终结者附加到一个外国指针上。也许你是。
  3. 你需要对终结者和gc小心。如果终结器引用了它终结的对象,那么该对象和它的终结器将保持对方的生命(它们不能立即被收集,因为终结器可能会在某个地方存储对该对象的引用,然后该对象将是活动的,因此不应该被终结。

我不知道这是否正确,但更好的是:

代码语言:javascript
复制
(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))))

以下是一些错误的地方:

  1. 如果来自%create-lcmlcm_get_fileno的错误,则finaliser将不会运行。
票数 3
EN

Stack Overflow用户

发布于 2018-08-06 09:43:04

您可能想了解一下cl-autowrap,它主要用于在cl-sdl2中包装SDL 2。该库为指针提供了薄薄的包装,这些指针在终结时已经释放了内存。

我还认为,使用终结器的推荐方法是只使用它们来清除可能的泄漏,因为您几乎无法控制何时以及如何执行清理功能(例如,哪个线程、哪个动态环境)。

管理内存的一种方法是提前分配结构,并在不再需要时(池)清理它们。或者,您可以定义一个函数或宏,该函数或宏定义一个作用域,以便在输入内存时分配内存,并在退出时释放,使用展开保护:

代码语言:javascript
复制
(defmacro with-lcm ((context &rest options) &body body)
  (let ((internal (gensym))) 
    `(let* ((,internal (create-lcm ,@options))
            (,context ,internal))
       (unwind-protect (progn ,@body)
         (destroy-lcm ,internal)))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51695898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档