Freeing memory from C
Chris
wendlec at tcd.ie
Tue Dec 3 06:45:06 PST 2013
On Tuesday, 3 December 2013 at 14:18:35 UTC, John Colvin wrote:
> On Tuesday, 3 December 2013 at 13:05:20 UTC, Mike Parker wrote:
>> On 12/3/2013 9:31 PM, John Colvin wrote:
>>>
>>> You should be fine to free in that way as long as you haven't
>>> done
>>> anything crazy like separately static linking libc.
>>>
>>
>> I wouldn't advise this in the general case. When you have
>> complete end-to-end control, sure. But if, for example, you're
>> using a dynamic binding to load a shared library, all bets are
>> off. Most likely on Linux and Mac you'll be fine. But on
>> Windows, the shared lib could have been compiled with DMC,
>> GCC, MSVC, or who knows what else.
>
> Fair point.
>
> What I should have said is:
>
> This is fine as long as you know you that both the C code and D
> code will be using the same so/dll/dylib C runtime.
>
> It's worth noting that the situation is not specific to D: it's
> exactly the same as freeing memory in C that you got from a
> library. If they are using different runtimes, or even
> different instances of the same runtime, all bets are off. At
> best, your memory won't get freed, at worst it will cause
> corruption.
As with all C code I can only say I _hope_ I know what I'm doing.
The C code is compiled into a library and linked to the D program
at compile time. It's one executable. So I hope that's fine.
I noticed a strange behavior though. In my C code I had an
uninitialized variable[1], the "int length;" mentioned above.
When I compiled it to a library and linked it with my program,
everything worked fine, the string was allocated correctly and
came out as expected, i.e. the length was calculated correctly
with "length += otherlength;". However, when I moved the same
library to my vibe.d project, compiled and linked, I got a
segmentation fault and the program crashed. It wasn't until then,
that I became aware of uninitialized variable. I think that the
latter behavior is the correct one (segfault > crash). But why
did it work correctly in the other D program, how did the C
variable get initialized?
[1] a D habit not to write "int i = 0;", but just "int i;", being
the spoiled D-brat I am
More information about the Digitalmars-d-learn
mailing list