Order of destruction when garbage collection kicks in
Regan Heath
regan at netmail.co.nz
Wed Apr 10 02:51:33 PDT 2013
On Tue, 09 Apr 2013 20:55:09 +0100, Henning Pohl <henning at still-hidden.de>
wrote:
> In fact there is no order of destruction. And this is one of the most
> annoying D problems I recently had to deal with. Look at this example:
> http://dpaste.dzfl.pl/f3f860b0. This time, it segfaulted. Next time it
> may (in theory) not, because the dtor of a is called before the one of
> b. A holds a reference to a B. In the destructor of A I expect b either
> to be null or a valid instance of B (which has not been destroyed yet).
> You get a kind of undefined behavior instead. This is IMO a huge
> drawback towards reference counting with strong/weak references.
>
> Is there right now any way to arrange things?
Have a look at C# and the dispose pattern:
http://msdn.microsoft.com/en-gb/library/fs2xkftw.aspx
You can implement this in D albeit without the hook into the GC to
"prevent finalization" because that concept does not exist.
In D you would..
- Your object implements a Dispose method which calls a protected/private
Dispose(bool) with true.
- Your object destructor calls Dispose(bool) with false.
- In Dispose(true) will clean up managed (GC) resources and objects etc.
- In Dispose(false) will only clean up unmanaged (OS handles etc).
- In Dispose(bool) you set a disposed flag to true to prevent further
disposal.
In your user code you would call Dispose when you were done with an
object. This would trigger Dispose(true) and clean up other GC
resources. If not called, the destructor will call Dispose(false).
It's not perfect, but it's organised and safe.
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list