GC and dtors ~ a different approach?
Bruno Medeiros
brunodomedeirosATgmail at SPAM.com
Mon Apr 10 05:33:56 PDT 2006
kris wrote:
> I thought it worthwhile to review the dtor behaviour and view the
> concerns from a different direction:
>
> dtor 'state' valid:
> - explicit invocation via delete keyword
> - explicit invocation via raii
>
> dtor state 'unspecified':
> - implicitly called when no more references are held to the object
> - implicitly called when a program terminates
>
>
> Just for fun, let's assume the 'unspecified' issue cannot be resolved.
> Let's also assume there are dtors which expect to "clean up", and which
> will fail when the dtor state is 'unspecified'.
>
> What happens when a programmer forgets to explicitly delete such an
> object? Well, the program is highly likely to fail (or be in an
> inconsistent state) after the GC collects said object. This might be
> before or during program termination.
>
> How does one ensure this cannot occur? One obvious method would be for
> the GC to /not/ invoke any dtor by default. While the GC would still
> collect, such a change would ensure it cannot be the cause of a failing
> program (it would also make the GC a little faster, but that's probably
> beside the point).
>
> Assuming that were the case, we're left with only the two cases where
> cleanup is explicit and the dtor state is 'valid': via the delete
> keyword, and via raii (both of which apply the same functionality).
>
> This would tend to relieve the need for an explicit dispose() pattern,
> since the dtor is now the equivalent?
>
> What about implicit cleanup? In this scenario, it doesn't happen. If you
> don't explicitly (via delete or via raii) delete an object, the dtor is
> not invoked. This applies the notion that it's better to have a leak
> than a dead program. The leak is a bug to be resolved.
>
> What would be really nice is a tool to tell us about such leaks. It
> should be possible for the GC (when configured to do so) to identify
> collected objects which have a non-default dtor. In other words, the GC
> can probably tell if a custom dtor is present (it has a different
> address than a default dtor?). If the GC finds one of these during a
> normal collection cycle, and is about to collect it, it might raise a
> runtime error to indicate the leak instance?
>
> Anyway ~ to summarize, this would have the following effect:
>
> 1) no more bogus crashes due to dtors being invoked in an invalid state
> 2) no need for the dispose() pattern
> 3) normal collection does not invoke dtors, making it a little faster
> 4) there's a possibility of a tool to identify and capture leaking
> resources. Something which would be handy anyway.
>
>
> For the sake of example: "unscoped" resources, such as connection-pools,
> would operate per normal in this scenario: the pool elements should be
> deleted explicitly by the hosting pool (or be treated as leaks, if they
> have a custom dtor). The pool itself would have to be deleted explicitly
> also ~ as is currently the case today ~ which can optionally be handled
> via a module-dtor.
>
> Thoughts?
All of those pros you mention are valid. But you'd have one serious con:
* Any class which required cleanup would have to be manually memory managed.
--
Bruno Medeiros - CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
More information about the Digitalmars-d
mailing list