On Saturday, 6 August 2022 at 02:14:24 UTC, Steven Schveighoffer
wrote:
On 8/5/22 8:51 PM, Don Allen wrote:
And this, from Section 32.2 of the Language Reference Manual:
````
If pointers to D garbage collector allocated memory are passed
to C functions, it's critical to ensure that the memory will
not be collected by the garbage collector before the C
function is done with it. This is accomplished by:
Making a copy of the data using core.stdc.stdlib.malloc()
and passing the copy instead.
-->Leaving a pointer to it on the stack (as a parameter
or automatic variable), as the garbage collector will scan the
stack.<--
Leaving a pointer to it in the static data segment, as
the garbage collector will scan the static data segment.
Registering the pointer with the garbage collector with
the std.gc.addRoot() or std.gc.addRange() calls.
````
I did what the documentation says and it does not work.
I know, I felt exactly the same way in my post on it:
https://forum.dlang.org/post/sial38$7v0$1...@digitalmars.com
I even issued a PR to remove the problematic recommendation:
https://github.com/dlang/dlang.org/pull/3102
But there was pushback to the point where it wasn't worth it.
So I closed it.
As I said in my previous post, the documentation issue really
needs to be addressed.
I do realize now that I *assumed* that what I did was going to
result in a stack reference to the c-string I was trying to keep
alive. Bad assumption, obviously. But I think the point is that
there is a simple, reliable mechanism -- addRoot, removeRoot --
that works and the documentation should say that and only that.
Walter said this in his 9/25/21 post: "Use GC.addRoot() to keep a
reference alive. That's what it's for.
". That's all that's needed. All the rest leads people like me
who don't think like a compiler to make the mistake I made.