Delegate is left with a destroyed stack object

qznc qznc at web.de
Tue Oct 29 14:14:38 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?

Seems reasonable to me.

S s = S(1); // allocates on the stack, because value type, i is 
now 1
{ writeln(s); } // creates closure with reference to stack memory 
"&s"
return ... // returns and destroys local variable s, i is now 666
foo()() // calls closure with reference to invalid memory "&s"

Returning closures with reference to stack memory is a bad idea. 
Maybe @safe should prohibit this?


More information about the Digitalmars-d mailing list