Thread overview | ||||||
---|---|---|---|---|---|---|
|
June 19, 2012 Does the 'with' statement affect object lifetime? | ||||
---|---|---|---|---|
| ||||
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 -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html |
June 19, 2012 Re: Does the 'with' statement affect object lifetime? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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@lycus.org http://lycus.org |
June 19, 2012 Re: Does the 'with' statement affect object lifetime? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On 06/19/2012 07:51 PM, Ali Çehreli wrote:
>
> Bug?
>
Bug.
|
June 19, 2012 Re: Does the 'with' statement affect object lifetime? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | On 06/19/2012 10:56 AM, Alex Rønne Petersen wrote: > 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. Ah... Good point. Here is the bug report: http://d.puremagic.com/issues/show_bug.cgi?id=8269 Ali |
Copyright © 1999-2021 by the D Language Foundation