On Wednesday, 12 November 2014 at 16:10:34 UTC, ketmar via Digitalmars-d-learn wrote:
On Wed, 12 Nov 2014 16:03:08 +0000
Chris via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:

On Wednesday, 12 November 2014 at 14:42:34 UTC, Chris wrote:
> On Wednesday, 12 November 2014 at 14:26:15 UTC, ketmar via
>> if you can extend C DLL, just add wrapper for `free()` >> there. so you >> will not call `free()` from D, but call C DLL function >> which will free >> the memory. it's a good practice anyway, 'cause it's >> recommended to
>> free memory in the same library where you allocated it.
>
> I initially had an implementation that did exactly that (I > usually do that), but for some reason it didn't work > properly in this particular case and caused all sorts of > undefined behavior. But I'll have a look at it again.

I've changed the code so that the memory is freed in C. Although it works "better" it crashes too every now and then

(WindowsError : exception : access violation writing 0x0310A1B4)

Will look into it.
this also can happen due to allocators conflict somehow. or due to other code which stores the pointer somewhere and then accesses the
memory. i think that it will be hard to trace without debugger.

Thanks a million! Just checked it this morning. It was the latter. I kept a reference to short* data in a class variable in D and didn't clear that reference when freeing the memory in the C library.

Interesting though that it never crashes on Linux, only on Windows did this cause problems.

It is also interesting that core.stdc.stdlib.free() and free() in the C library produced a slightly different crash behavior. But that might be down to the fact that the two happen in different places in the program.

Reply via email to