Bug in RefCounted?

Ali Çehreli acehreli at yahoo.com
Mon Oct 28 13:43:01 PDT 2013


On 10/28/2013 12:30 PM, Maxim Fomin wrote:

 > So do you *know* cases or suspect that they may exists? Or remember some
 > bug issue?
 >
 > Here is my attempt:
 >
 > import std.stdio;
 >
 > struct S
 > {
 >     int i;
 >     this(int i)   { writefln("ctor, %X", i); this.i = i; }
 >     this(this)  { writefln("postblit, %X, %X", &this, i); }
 >     ~this()     { writefln("dtor, %X, %X", &this, i); }
 > }
 >
 > auto foo()
 > {
 >     S s = S(1);
 >     return { s = S(2); } ;
 > }
 >
 > void main()
 > {
 >     foo()();
 > }
 >
 > ctor, 1
 > dtor, 7FFFF7ED8FF8, 1
 > ctor, 2
 > dtor, 7FFFFFFFDB30, 1
 >
 > Inside foo() function object 's' is destroyed twice: first time as a
 > regular struct at the end of block scope, second time before assigning
 > S(2).

Ok, that's too much! :( Inspired by your program, the following delegate 
completely misses the point:

import std.stdio;

struct S
{
     int i;
     ~this() { i = 666; }
}

auto foo()
{
     S s = S(1);

     // When I see the following delegate, I think "the lifetime of s is
     // extended." I expect my delegate to print 1.
     return { writeln(s); } ;
}

void main()
{
     // Unfortunately, the following prints 666!
     foo()();
}

What is the purpose of writeln in that delegate? Obviously, to print 1. 
Yet it doesn't happen that way. Is this accepted to be a bug? Should the 
programmer 'new' the object instead?

Ali



More information about the Digitalmars-d-learn mailing list