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

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示