Delegate is left with a destroyed stack object
David Nadlinger
code at klickverbot.at
Tue Oct 29 14:32:58 PDT 2013
On Tuesday, 29 October 2013 at 21:14:39 UTC, qznc wrote:
> { 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"
That's not how closures work in D – the local variables
referenced by nested functions/closures will be allocated inside
the "nested context" for the function, which is placed on the GC
heap if a reference to it can be escaped. Play around with the
example some more if you want: Barring any further DMD bugs, you
are not going to get the contents of i to be corrupted (i.e. set
to another garbage value).
The problem with the compiler behavior for the code in question
is that it destructs a live object, and thus clearly breaks the
type system.
I think the only correct resolution is to not destruct the object
at the end of foo() – which incidentally also means that the
destructor will never be invoked, just as for any other
GC-finalized memory.
David
More information about the Digitalmars-d
mailing list