Releasing malloc'd memory using ctypes?

Diez B. Roggisch deets at nospam.web.de
Mon Dec 24 09:52:16 EST 2007


skip at pobox.com schrieb:
> I am starting to experiment with ctypes.  I have a function which returns a
> pointer to a struct allocated in heap memory.  There is a corresponding free
> function for that sort of struct, e.g.:
> 
>     from ctypes import *
> 
>     cdll.LoadLibrary("libthing.so")
>     c_thing = CDLL("libthing.so")
> 
>     class THING(Structure):
>         _fields_ = [("name", c_char_p),
>                     ("value", c_int)]
> 
>     get_thing = c_thing.get_thing
>     get_thing.restype = POINTER(THING)
>     free_thing = c_thing.free_thing
> 
> So I call get_thing() and get back this ctypes wrapper for a pointer to a
> thing.  I can extract the name and value elements from the thing instance
> just fine:
> 
>     thing_p = get_thing()
>     thing = thing_p.contents
>     print thing.name, "=", thing.value
> 
> Now I need to call free_thing.  What do I pass it?  thing_p?  Some attribute
> of thing_p?  Something else altogether?  The ctypes module docs seem to be
> strangely silent on the question of freeing heap memory which you've
> received from the underlying library's functions.

You simply declare free by loading libc (I'm a unix-guy, Windows will 
have an equivalent) as library and then declaring it. And of course it 
gets a void-pointer, so you have to cast you pointer to void* - as you'd 
have in C (or get a warning).

Diez



More information about the Python-list mailing list