Can't I allocate at descontructor?

Mike Parker aldacron at gmail.com
Sat Mar 6 05:35:14 UTC 2021


On Saturday, 6 March 2021 at 04:29:41 UTC, Jack wrote:

> Now about the behavior of a static destructor, like static 
> ~this() { } is this guaranteed to be run?

Yes. Some perspective:

1. During program execution, class/struct destructors on 
stack-allocated instances are  invoked when the instances go out 
of scope.

2. During program execution, class/struct destructors on 
GC-allocated instances are only called when the GC determines the 
instances are no longer referenced AND it needs to reclaim 
memory. There is no way to know when or if this will happen 
during the program's execution. Short-lived programs may never 
need to reclaim memory, so the destructors may never be called. 
The longer a program runs, and the more it allocates from the GC 
heap, the more likely it is that a given object's destructor will 
be called during execution since the GC will need to reclaim 
memory more often. This is a consequence of relying on the GC to 
manage memory.

3. After the main function exits, the runtime will invoke all 
module destructors. They do not belong to any class or struct 
instance, nor are they managed by the GC. They will always 
execute.

4. After module destructors are invoked, the GC will begin its 
shutdown. By default, it will invoke the destructors on every 
class/struct instance for which it hasn't. This can be disabled 
via a command-line argument for DRuntime.

So with the current implementation, all GC-managed class and 
struct destructors will end up being called at some point. But 
the spec does not require the GC to invoke destructors during 
shutdown--that's an implementation detail. Moreover, since the 
person executing the program can turn that behavior off via a 
command-line argument, you can't rely on the default behavior 
anyway. So that's why the documentation says that class and 
struct destructors are not guaranteed to be invoked by the GC.


More information about the Digitalmars-d-learn mailing list