我将轻量级通信和编组从朱莉娅移植到lisp,因为它有一个更好的API。我使用大口来生成C函数调用。
我想知道这是否是C指针的安全使用。以下是create函数:
(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))))问题:
欢迎您提出任何其他意见。
提前谢谢。
发布于 2018-08-06 09:06:31
以下是一些错误的地方:
我不知道这是否正确,但更好的是:
(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的错误,则finaliser将不会运行。发布于 2018-08-06 09:43:04
您可能想了解一下cl-autowrap,它主要用于在cl-sdl2中包装SDL 2。该库为指针提供了薄薄的包装,这些指针在终结时已经释放了内存。
我还认为,使用终结器的推荐方法是只使用它们来清除可能的泄漏,因为您几乎无法控制何时以及如何执行清理功能(例如,哪个线程、哪个动态环境)。
管理内存的一种方法是提前分配结构,并在不再需要时(池)清理它们。或者,您可以定义一个函数或宏,该函数或宏定义一个作用域,以便在输入内存时分配内存,并在退出时释放,使用展开保护:
(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)))))https://stackoverflow.com/questions/51695898
复制相似问题