Missing destructor call using clear and base interface ref.

Roberto Delfiore roberto.delfiore at gmail.com
Thu Aug 9 01:36:54 PDT 2012


Thank you for your analysis, it's a very strange behavior. I
still can not figure out if there is something I don't know or if
it's is simply a bug.

Good answer: Shouldn't destroy() work on an interface?

On Monday, 6 August 2012 at 20:46:45 UTC, Ali Çehreli wrote:
> On 08/06/2012 06:59 AM, Roberto Delfiore wrote:
> > See the following code:
> >
> > interface A{
> > }
> >
> > class B : A{
> > this(string name){this.name = name;}
> > ~this(){
> > writefln("Destructor %s", name);
> > }
> > string name;
> > }
> >
> > void main(){
> > B b0 = new B("b0");
> > B b1 = new B("b1");
> >
> > A a = b0;
> > clear(a);
> >
> > clear(b1);
> > }
> >
> > Output:
> > Destructor b1
> >
> > dmd 2.059
> >
> > Why is the B destructor not invoked in the first clear?
> >
> > Expected output:
> > Destructor b0
> > Destructor b1
> >
>
> Interesting.
>
> I've tested the code with 2.060 after replacing 'clear' with 
> 'destroy' (not required here, but because clear will be 
> deprecated):
>
> import std.stdio;
>
> interface A{
> }
>
> class B : A{
>     this(string name){this.name = name;}
>     ~this(){
>         writefln("Destructor %s", name);
>     }
>     string name;
> }
>
> void main(){
>     B b0 = new B("b0");
>     B b1 = new B("b1");
>
>     A a = b0;
>     writeln("Before clear(a)");
>     destroy(a);
>
>     writeln("Before clear(b1)");
>     destroy(b1);
>
>     writeln("Leaving main");
> }
>
> I see both of the destructor calls but the first one is 
> executed out of order:
>
> Before clear(a)
> Before clear(b1)
> Destructor b1
> Leaving main
> Destructor b0    <-- Here
>
> Making 'a' a B produces the expected output:
>
>     B a = b0;
>
> Before clear(a)
> Destructor b0    <-- Now at expected time
> Before clear(b1)
> Destructor b1
> Leaving main
>
> I guess destroy() is a no-op on an interface because your not 
> seeing the destructor's effect and my seeing it can be 
> explained by the non-deterministic behavior of the GC regarding 
> destructor calls: If it is up to the GC, the destructor calls 
> are not guaranteed.
>
> Do others know? Shouldn't destroy() work on an interface?
>
> Ali


More information about the Digitalmars-d-learn mailing list