Destructor semantics
foobar
foo at bar.com
Tue Aug 10 15:59:59 PDT 2010
Steven Schveighoffer Wrote:
> On Tue, 10 Aug 2010 18:09:53 -0400, foobar <foo at bar.com> wrote:
>
> > Steven Schveighoffer Wrote:
> >
> >> So either you are saying that structs that are in classes are never
> >> destroyed, and you have a resource leak, or every class has an
> >> auto-generated destructor that calls the struct destructors, and we have
> >> the same determinism problem you purport to solve. If a struct is in a
> >> class, it's on the heap. You have not solved the problem.
> >>
> >> -Steve
> >
> > Sorry for the confusion, my explanation wasn't good enough. Let me try
> > again:
> >
> > We have 4 different cases:
> >
> > case 1, class contains a struct:
> > a. the sturct is not an independent block of memory. Instead, it is
> > part of the same memory block of the class instance's memory.
> > b. every class has an auto-generated destructor that calls the struct
> > destructors. This is safe because of the point a.
>
> It's only safe if the struct destructor does not deallocate any heap data.
>
> Here is a simple counter case
>
> Class contains struct, which in turn contains another class. The struct
> destructor cannot run because the class it points to may already have been
> cleaned up.
>
> Example:
>
> class A {}
>
> struct B { A a; ~this() {delete a;} }
>
> class C { B b; }
>
> what happens when GC destroys a C?
>
> C::~this(); // auto generated
> B::~this(); // so good so far
> A::~this(); // oops! the a is gone, program vomits bits all over
> itself and chokes to death.
>
> -Steve
This can only happen if you use delete on a class instance. My understanding was that this is going to be removed from D2.
Without this (mis-)feature, the GC cannot remove an instance of A as long as the matching instance of C which (indirectly) contains a reference to it is still alive.
More information about the Digitalmars-d
mailing list