[cffi-devel] Re: CFFI malloc free

Surendra Singhi efuzzyone at netscape.net
Mon Dec 19 09:12:39 UTC 2005


Luís Oliveira <luismbo at gmail.com> writes:

> Surendra Singhi <efuzzyone at netscape.net> writes:
>>  If I have a C function which allocates memory for a C string and returns a
>> pointer to this memory (return type char *).
>>
>> Should the return type of this function be :string or :pointer? 
>
> Either :pointer or :string+ptr. The :string+ptr type will return a list
> with two values: a lisp string and a pointer to the C string.
>
>> How do I deallocate this memory? Should I use `foreign-string-free' or
>> `foreign-free'. 
>
> I have been meaning to look into this. Right now, you'd have to use
> something like (foreign-funcall "free" :pointer <your-pointer>)
>
>> Is there any way this deallocation can be made automatic?
>
> Not that I know of. However, I suspect that, in your case, something like
> this would suffice:
>
> (defcfun your-foreign-function :pointer ...)
>
> (defun your-wrapper-around-the-foreign-function (...)
>   (let ((ptr (your-foreign-function ...)))
>     (unwind-protect
>         (foreign-string-to-lisp ptr)
>       (foreign-funcall "free" :pointer ptr))))
>
> Or you could define a new type to do this:
>
> (defctype my-string :pointer)
>
> (define-type-translator my-string :from-c (value)
>   "Converts a foreign string to lisp, and frees it."
>   (once-only (value)
>     `(unwind-protect (foreign-string-to-lisp ,value)
>        (foreign-funcall "free" :pointer ptr))))
>

Can the foreign string in the above example contain the null character? Or
does cffi assumes that it is a null terminated string? 

Thanks.
-- 
Surendra Singhi
http://www.public.asu.edu/~sksinghi/index.html

,----
| WHY SHOULD WE SAVE TIGER?  	
| Ans: Saving the tiger means saving mankind..	
| 
| Help http://pudang.tripod.com/
| or https://secure.worldwildlife.org/forms/tiger_appeal_1.cfm
`----




More information about the cffi-devel mailing list