Program crash: GC destroys an object unexpectedly

eugene dee0xeed at gmail.com
Thu Sep 23 18:18:16 UTC 2021


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.




More information about the Digitalmars-d-learn mailing list