delegates and temporary struct
Steven Schveighoffer
schveiguy at yahoo.com
Fri May 17 08:02:06 PDT 2013
On Thu, 16 May 2013 18:53:55 -0400, Jack Applegame <japplegame at gmail.com>
wrote:
> Look at this code:
>> import std.stdio;
>>
>> class Foo {
>> int value = 123456;
>> }
>>
>> struct Bar {
>> this(Foo f) { foo = f; }
>> @property auto lambda() {
>> return (){ writefln("value = %s", foo.value); };
>> }
>> Foo foo;
>> }
>> auto getLambda(Foo f) {
>> return Bar(f).lambda; // lambda closure points to temporary Bar on the
>> stack
>> }
>> void main() {
>> Foo foo = new Foo;
>> auto lambda = getLambda(foo);
>> lambda(); // undefined behaviour? prints some number, but not 123456
>> }
> It compiles, but result is unpredictable.
>
> Platform: Windows 7, dmd 2.062
>
> For reproducing this behaviour it's necessary to omit -inline and -O
> flags, try simple "rdmd test.d"
Using struct delegates is VERY frought with danger. You must ensure the
struct is alive when the delegate is called. I don't think the compiler
can detect the cases where it's not and allocate a closure.
I also have found this out the hard way...
Only recourse is to ensure the struct is on the heap.
-Steve
More information about the Digitalmars-d-learn
mailing list