dip10003
不能在类上引用计数,至少是安全的,因为没有逃逸分析.
想法是编写不暴露字段的类.成员函数控制所有访问.
如下编译:
@safe @nogc:
class C {
C g() => this;
}
//C f(C c); // 错误
C f(scope C c); // OK
//C f(scope C c) { return c.g; } // 错误
void main()
{
scope c = new C(); // 栈上分配,要求`域`字.
f(c);
}
已用简单规则区别ref return scope.
大的可用性问题是scope使用ref参数的方式.
你真的需要借用和物主语义.按域表借用,用新的类型限定符表物主.
"ref return scope"只能跟踪栈.
class D{
C c;
}
class C {
D d;
int x=3;
this(D d)@safe @nogc{
//标记它为`域`确实会检测到该错误.
d.c=this;
this.d=d;
}
}
C foo(D d)@nogc @safe{
scope c = new C(d); // 删域不崩溃.
return c.d.c; // c逃逸
}
void main(){
import std.stdio;
writeln(foo(new D)); // 段错误.
}
加入漏洞大全.
如果以通过示例使其失败,请发布到bugzilla.
这就是@live添加的内容,不仅跟踪栈.
:尚未学习DIP1000规则的D程序员通常期望以下两个函数声明是等价的:
void foo(scope int** p);
void bar(scope ref int* p);
幸运的是,"域"只是减法,只是限制你.因此,编译器会检测到使用中的错误.
浙公网安备 33010602011771号