Help with Win32: PostQuitMessage(0) doesn't post WM_QUIT apparently, because the message loop is not exited.

Mike Parker aldacron at gmail.com
Fri Aug 13 19:59:46 UTC 2021


On Friday, 13 August 2021 at 16:18:06 UTC, Ruby The Roobster 
wrote:

> Context for this: I am creating a module of my  own, and this 
> is a class contained in the module.  You will notice that after 
> calling this class' constructor anywhere in a Win32 API 
> program, that the program doesn't close after the window is 
> closed.

You're hanging in `Runtime.terminate`. That's because of your 
`Entity` destructor, specifically this line:

     entitytable.length -= 1;

Comment it out and the program exits successfully.

You aren't supposed to be manipulating GC-managed memory via 
class destructors. You can not rely on that memory being valid at 
the time that it's accessed in the destructor---the object may 
already have been destroyed. Nondeterministic destruction is the 
price you pay for letting the GC manager your object memory.

Of course, in this case, the problem will only crop up at 
termination since the array is declared at module scope so will 
be live up until the GC shuts down. But still, not something you 
should be doing.

The runtime will help you by throwing an error if you do anything 
that directly triggers an allocation, like calling `new` or 
performing an array append. But it won't help you with anything 
else.

Someone more versed than I with the GC innards may be able to 
answer whether an error should be thrown here as well, or if this 
goes under the undefined behavior category.


More information about the Digitalmars-d-learn mailing list