Delegate is left with a destroyed stack object

Craig Dillabaugh cdillaba at cg.scs.carleton.ca
Tue Oct 29 12:02:22 PDT 2013


On Tuesday, 29 October 2013 at 17:55:45 UTC, Ali Çehreli wrote:
> Continuing the conversation from the following thread:
>
>   http://forum.dlang.org/post/l4mi8l$1r1$1@digitalmars.com
>
> (Note: The OP's example there behaves as expected on git head.)
>
> The programmer thinks that the following delegate returned by 
> foo() will print S(1) because the delegate uses the local 's' 
> which is supposed to live long enough:
>
> import std.stdio;
>
> struct S
> {
>     int i;
>     ~this() { i = 666; }
> }
>
> auto foo()
> {
>     S s = S(1);
>     return { writeln(s); } ;  // <-- Uses local s
> }
>
> void main()
> {
>     foo()();
> }
>
> However, 's' gets destroyed upon leaving foo() and the delegate 
> is left with a destroyed object; so the program prints S(666).
>
> Is that by design or a bug?
>
> Aside: Never mind that the destroyed object gets destroyed 
> again, and again, and again. :) (Well, presumably after being 
> copied to other object in its dead state, because the address 
> of the object is not the same.) (Put a writeln() inside the 
> destructor to see that in action.)
>
> Ali

According to the Book of Revelations, 666 is the number of the
Beast (Rev. 13:18), and later (Revelations 19:20) it is stated
that the Beast will be thrown into a lake of fire and brimstone.

That may explain the repeated destruction of s :o)

Whether that is a bug or not, I am unsure.

Craig


More information about the Digitalmars-d mailing list