Releasing malloc'd memory using ctypes?

S

skip

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.

Thanks,

Skip
 
D

Diez B. Roggisch

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top