On Wednesday, 28 April 2021 at 10:04:20 UTC, Ola Fosheim Grøstad wrote:
>It is currently an issue that people might write a class for RAII and then allocate in on the GC heap, that means that destructors can be called in the wrong order.
If D adds a finalizer() method, this could be resolved the following way:
Objects with non-empty destructors cannot be GC allocated.
The finalizer() method should be used for releasing all non-GC resources accessible from non-GC pointers/identifiers, but one should not follow pointers to GC-memory from a finalizer as they may not exist.
So a RAII object needs to call the finalizer from the destructor, but exactly what would the implications be for inheritance?
Anyway, if it isn't clear, the basic goal is to allow RC-based RAII and GC to coexist.
Or would it be better to simply forbid any cleanup in the GC? I kinda think so, but I also think many D users are used to letting the GC trigger cleanup on collection.
What do you think?
Split the finalizer from the destructor and make the finalizer an interface.
-Alex