d按域标记析构器
C c;
class C {
~this() @safe {
c = this;
}
}
这是可以接受的,但不安全.我建议始终按"域"
标记析构器
赋值
类引用给另一个
类引用是安全的.我同意
除非赋值垃圾
,更详细的不安全示例:
import std.stdio: writeln;
import core.memory: GC;
C c;
class C
{
immutable int* ip;
this(int x) @safe { this.ip = new int(x); }
~this() @safe { c = this; }
}
void main() @safe
{
() { new C(42); } ();
() { ubyte[1000] clear_stack; } ();
() @trusted { GC.collect(); } ();
immutable int* ip = c.ip;
writeln(*ip); /* 打印"42". */
new int(13);
int should_still_be_42 = *ip;
writeln(should_still_be_42); /* 打印"13" 修改了不变数据. */
}
我意思是用域
标记带@safe
的析构器.这样不会有副作用
.
会有副作用
.如,在结构上,标记
析构器为域
会阻止返回此结构
实例.
更谨慎
措施是标记逃逸
析构器为@system
(即,使原代码
成为编译时错误)
不,它仅限制析构器函数体
,而不限制析构器
调用者.
用-dip1000
编译它:
@safe:
struct S
{
~this() scope {}
void* p;
}
S test()
{
S s;
//错误:可能不会返回s域变量
return s;
}
void main()
{
}
这像是旧dip1000
设计的错误/残余
这里引入.
已修复
.因此,现在应该很清楚了,要按"域"
标记析构器
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现