0
点赞
收藏
分享

微信扫一扫

d域参数通过闭包逃逸


​​原文​​

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在​​动态分配​​​的闭包中,然后通过​​返回​​​的闭包​​逃逸​​​了.​​解决方法​​​是禁止把​​域变量​​​放入​​动态闭包​​​中.
且,如果在​​​动态闭包​​​中引用​​变量​​​,则不能推断该​​变量​​​为​​域​​.


举报

相关推荐

0 条评论