我正在将轻量级通信和编组从julia移植到lisp,因为它有更好的API。我使用swig生成C函数调用。
我想知道这是否是C指针的安全用法或……
以下是一些错误:
我不知道这是否正确,但它更好:
(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
你可能想读一下 cl-autowrap ,特别用于包装 SDL 2 在 cl-sdl2 。该库提供了围绕指针的精简包装器,这些指针在完成时已经释放了内存。
cl-autowrap
cl-sdl2
我认为使用终结器的推荐方法只是用它们来清理可能的泄漏,因为你几乎无法控制执行清理功能的时间和方式(例如哪个线程,哪个动态环境)。
管理内存的一种方法是提前分配结构,并在不再需要它们时清理它们(池)。或者您可以定义一个函数或宏来定义一个范围,以便在输入内存时分配内存并在退出时使用unwind-protect释放:
(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)))))