On Thursday, 23 September 2021 at 17:16:23 UTC, Steven Schveighoffer wrote:
On 9/23/21 12:58 PM, eugene wrote:
On Thursday, 23 September 2021 at 15:56:16 UTC, Steven Schveighoffer wrote:
See more details:

https://docs.microsoft.com/en-us/dotnet/api/system.gc.keepalive?view=net-5.0#remarks


"
This method references the obj parameter, making that object ineligible for garbage collection from the start of the routine to the point, in execution order, where this method is called. Code this method at the end, not the beginning, of the range of instructions where obj must be available.
"

**Code this method at the end...**

:)
it is the same as proposed by jfondren simple
writeln(stopper.sg0.number) in the end of main, right?

Same effect, but writeln actually executes code to write data to the console, whereas KeepAlive doesn't do anything.

```d
void keepAlive(Object o) {
}

void main(string[] args) {

    import core.memory : GC;

    auto Main = new Main();
    Main.run();

    auto stopper = new Stopper();
    stopper.run();

    writeln(" === Hello, world! === ");
    auto md = new MessageDispatcher();
    md.loop();

    keepAlive(Main);
    keepAlive(stopper);

    writeln(" === Goodbye, world! === ");
}
```
works ok with dmd, stopper is not collected.


Reply via email to