Passing string from D to c++

monarch_dodra monarchdodra at gmail.com
Wed Jul 31 03:15:43 PDT 2013


On Wednesday, 31 July 2013 at 08:20:48 UTC, deadalnix wrote:
> On Wednesday, 31 July 2013 at 07:54:00 UTC, monarch_dodra wrote:
>> I want to point out that one of the dangers (as I've heard it, 
>> I haven't actually run into this), is that since the garbage 
>> collector won't scan your C function's internals, the caller 
>> *must* keep a reference in his code to preserve the allocated 
>> array. The above scheme does not do that: If the garbage 
>> collector runs after the start of the call, but before the end 
>> of the function, then you are in trouble.
>>
>
> You have to work very hard to not find it either in the stack 
> or in a register during the function call. So as long as the C 
> code do not keep a reference, ou should be fine.
>
>> I'd do it like this:
>> //----
>> string lifeline = toStringz("hello"); //Preserve reference
>> c_function(lifeline.ptr); //Make call
>> lifeline = null; //Release reference
>> //----
>>
>
> This is plain useless. dead store elimination will remove the 
> "release reference", the variable lifeline promoted to register 
> (its ptr part anyway, it length part is likely to be trashed 
> right away by the function call).
>
> On X86, the string will be returned in EAX and EDX (ptr in EDX 
> if I'm not mistaken). So the length will be erased by copying 
> EDX to EAX (now both contains the ptr, length is lost) and the 
> call made right away (first argument is passed in EAX).

I'll take your word for it then. As I said, I didn't run into 
this before, but I had read some other posts that mentioned this 
problem. I might have it confused with dynamic libs though?

I don't know. Forget I said anything then.

>> That's assuming c_function won't preserve the string 
>> somewhere. If it does, things get more complicated.
>
> If it does, that means big trouble, even in pure C, as it is 
> now unclear who is the owner of the string. A recipe for memory 
> corruption/leak.

Most probably.


More information about the Digitalmars-d mailing list