When this will be freed?
Steven Schveighoffer
schveiguy at yahoo.com
Fri Apr 4 06:44:54 PDT 2014
On Fri, 04 Apr 2014 09:25:49 -0400, Marc Schütz <schuetzm at gmx.net> wrote:
> On Wednesday, 2 April 2014 at 16:51:57 UTC, Benjamin Thaut wrote:
>> Am 02.04.2014 17:57, schrieb Andrea Fontana:
>>> I mean: if it is an exported function (of a shared library) what
>>> happens? There's no reference kept anywhere (in D). So if I'm right it
>>> could be freed immediatly by GC. Right?
>>>
>>
>> If you pass that string to a C function, there is a reference on the
>> stack. So this string will not be freed until that C-function returns.
>> If that C-Function returns, it is very likely however that this was the
>> only reference and the string will be freed the next time the garbage
>> collector runs.
>
> This is unfortunately only true on x86 32-bit. For x86_64, the calling
> conventions (MS, SysV [1]) say that the first few parameters are passed
> in registers, and the same is probably true for other architectures.
>
> Usually this is still safe, as the pointer will normally either stay in
> its register, or will be spilled to the stack and kept there as long as
> the function still needs to use it. But one might imagine a corner case
> where it temporarily stores the pointer in a global or static variable.
> Even if the pointer will not be kept by the C function longer than the
> call, in such cases you would need to keep an additional reference where
> the GC can see it.
In cases where it is stored in global data, and that becomes the only
reference, or if a C heap allocation is made, and the pointer is stored in
there (perhaps to pass to another C function?), then it's quite possible
the data could be collected prematurely in another thread.
You bring up a good point. This is something that should be considered
when calling extern(C) functions.
-Steve
More information about the Digitalmars-d-learn
mailing list