Can't free memory allocated in a C DLL?
Dmitry Olshansky
dmitry.olsh at gmail.com
Fri Aug 5 03:38:38 PDT 2011
On 05.08.2011 14:10, Johannes Pfau wrote:
> This is a reduced problem encountered with DTagLib on windows:
> TagLib allocates memory using malloc in a DLL compiled with MSVC (or
> mingw). When I try to free this memory in D the free() call just freezes
> infinitely. Here's the reduced test case:
> http://dl.dropbox.com/u/24218791/d/BUG.zip
I was bitten by this an awful lot of times. In general freeing memory
not where it's allocated is BAD. Even if it might work for code having
the same runtime _version_ as DLL one, it's still like sitting on pile
of dynamite.
> Before I file the bug: Can this even be fixed without using the MSVC
> runtime in D? Seems like this problem is caused by the different C
> runtimes (The same example works fine with GDC on windows).
Nope, different version of run-time has mildly different means for
allocation/deallocation. Which may or may not result in a crush or
memory corruption (recall that dynamite pile).
>
> I guess this is also the reason why most C libraries have their own
> *_free functions?
>
The only workable solution that I was able to come up with for this sort
of problem - if DLL escapes references, provide a close/free/dispose
function as well.
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list