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