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在动态分配
的闭包中,然后通过返回
的闭包逃逸
了.解决方法
是禁止把域变量
放入动态闭包
中.
且,如果在动态闭包
中引用变量
,则不能推断该变量
为域
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现