原文
void delegate() test(Object[] objs...) {
return {
foreach(obj; objs)assert(obj);
};
}
void delegate() foo() {
return test(new Object, new Object);
}
void main() {
auto ok = test(new Object, new Object);
ok(); // 没问题
auto it = foo(); // 其他地方构建
it(); // 触发失败.
}
猜测是参数在闭包栈上,所以ok()调用很好,因为测试调用仍然存在.
但是,foo调用把[newObject,newObject]留在现在可能无效的栈上.
此时,为闭包复制了其他局部变量,但忽略了arg可变参数.
@safe/dip1000,未检测到.这是内存安全问题.
简化版:
@safe
int delegate() test(scope int* p)
{
return () { return *p; };
}
p在动态分配的闭包中,然后通过返回的闭包逃逸了.解决方法是禁止把域变量放入动态闭包中.
且,如果在动态闭包中引用变量,则不能推断该变量为域.










