Does the 'with' statement affect object lifetime?

Alex Rønne Petersen alex at lycus.org
Tue Jun 19 10:56:25 PDT 2012


On 19-06-2012 19:51, Ali Çehreli wrote:
> Is the following code legal for a class?
>
> class C {
> int i;
> }
>
> void main() {
> with(new C()) {
> i = 42; // <-- Is the anonymous object alive at this point?
> }
> }
>
> The object seems to live long enough for a class. That's probably
> because the garbage collector kicks in late. But consider the same code
> with a struct:
>
> import std.stdio;
>
> struct S {
> int i;
>
> this(int i = 0)
> {
> writeln("constructed");
> }
>
> ~this()
> {
> writeln("destructed");
> }
> }
>
> void main() {
> with(S(1)) {
> writeln("inside 'with' statement");
> i = 42; // <-- Is the anonymous object alive at this point?
> }
> }
>
> The output indicates that the anonymous object is destroyed before the
> body of the with is executed:
>
> constructed
> destructed
> inside 'with' statement
>
> This contradicts with with's spec:
>
> http://dlang.org/statement.html#WithStatement
>
> It says that
>
>
> with (expression)
> {
> ...
> ident;
> }
>
> is semantically equivalent to:
> {
> Object tmp;
> tmp = expression;
> ...
> tmp.ident;
> }
>
> Bug?
>
> Ali
>

I say bug.

BTW, the reason the class reference is alive is because it's on the 
stack. Regardless of whether you're using with, it wouldn't be collected 
by the GC until the current stack frame exits.

-- 
Alex Rønne Petersen
alex at lycus.org
http://lycus.org


More information about the Digitalmars-d-learn mailing list