On 7/27/17 4:23 AM, Guillaume Piolat wrote:
On Wednesday, 26 July 2017 at 22:29:50 UTC, Steven Schveighoffer wrote:
Today, the finalizer is essentially a last-effort to clean up resources that would otherwise leak.

My point is that this "last chance" to clean up resources should only be used to tell deterministic destruction wasn't acheived (for reasons given in my former post: it's _too hard to explain_ how to do resource management else).

Consider reference counting with cycles. The proposal from Walter/Andrei is to do reference counting to clean up everything but cycles. For cycles, the GC will take care of it.

So how do you do this correctly without having two separate mechanisms?

The reason deterministic destruction sucks today is because once you go 2 levels deep, the only tool available (~this) cannot release any resources (because it's not legal to access GC-allocated members inside ~this).

You already know it, but if you commit to not doing anything in the finalizer case, then ~this doesn't suck, it works as a destructor and the restrictions lift.
So "suck" is a bit strong.

This is an unworkable solution. One simple time you forget to clean up deterministically and then you corrupt memory by using members that are already cleaned up.

Or, you disable calling destructors in the GC, and instead leak resources.

Or I suppose you could crash your application. This would be a fun bug to figure out...

-Steve

Reply via email to