ctypes free memory which is allocated in C DLL
zlchen.ken at gmail.com
zlchen.ken at gmail.com
Sat Oct 27 22:05:11 EDT 2012
On Sunday, October 28, 2012 6:26:28 AM UTC+8, Nobody wrote:
> On Sat, 27 Oct 2012 07:42:01 -0700, zlchen.ken wrote:
>
>
>
> > I have a DLL which written in C language, one of the function is to
>
> > allocate a structure, fill the members and then return the pointer of
>
> > the structure.
>
> >
>
> > After Python called this function, and done with the returned structure,
>
> > I would like to free the returned structure. How can I achieve this ?
>
> > Basically, I tried that I wrote a corresponding free interface in the
>
> > DLL, it works, but calling the libc.free in Python doesn't work.
>
> >
>
> > my_dll.return_structure_ptr.restypes = POINTER(Dummy) res_ptr =
>
> > my_dll.return_structure_ptr() windll.msvcrt.free(res_ptr) <==== doesn't
>
> > work, memory violation my_dll.free_dummy_struture(res_ptr) <== This
>
> > works.
>
>
>
> On Windows, a process may have multiple versions of the MSVCRT DLL (which
>
> provides malloc/free). If an executable or DLL is linked against multiple
>
> DLLs, each DLL could be using a different version of MSVCRT.
>
>
>
> Different versions of MSVCRT may have separate heaps, so anything which
>
> is allocated with malloc() (or calloc() or realloc()) from a specific
>
> version of MSVCRT must be passed to free() from the same version of MSVCRT.
>
> windll.msvcrt refers to the version of MSVCRT against which the Python DLL
>
> is linked, which isn't necessarily the version against which my_dll is
>
> linked.
>
>
>
> If a function in a DLL returns a pointer to memory which it allocated
>
> with malloc(), that DLL must also provide a function which can be used to
>
> free that memory. It can't leave it to the application (or higher-level
>
> DLL) to call free(), because the application may not be using the same
>
> version of MSVCRT as the DLL.
Thank you for the details.
This is really useful!
More information about the Python-list
mailing list