On Wednesday, 28 November 2018 at 22:40:17 UTC, unDEFER wrote:
Hello! After long-long time of debugging, I just have decided InvalidMemoryOperationError in my program. But now my program after few hours of testing again crashes with "Finalization error".

So InvalidMemoryOperationError means a GC function got called while the GC was locked. This is usually because you did an allocation inside a destructor.

Finalization error happens when a destructor throws an exception.

Now, many times, trying to throw an exception from inside a destructor will first trigger the invalid operation - allocating the exception will be an error before the exception actually exists. But there are a few ways around this, like preallocating or calling a function that uses a statically allocated exception.

Language features that use statically allocated exceptions include:

* InvalidMemoryOperationError
* OutOfMemoryError
* SwitchError

There might be more, but this is all I see right now (my process btw: search the druntime source code for "staticError", the function that makes those. But this is subject to change, so first maybe look up the definition of onOutOfMemoryError and see the pattern there.)

Of these... well, they are all kinda difficult to cause in a destructor.

Are you preallocating something in your code and throwing it in a destructor?

Also, what *exactly* is the message you get when the exception happens? It should include a line number from druntime as well as message from the inner exception that caused it in the first place.

Reply via email to