d@safe中允许创建内部指针
原文
垃集规范提到,结构
中具有内部指针
是未定义
行为.
@safe
代码中禁止未定义行为,但允许
创建内部指针
,而这可能会破坏dip1000
:
//用-preview=dip1000编译
@safe:
struct S {
int storage;
int* ptr;
this(int dummy) {
ptr = &storage;
}
int* get() return scope {
return ptr;
}
}
int* escape() {
S s = S(0);
return s.get; // s栈变量指针逃逸.
}
错误消息不是很好,但它正确
识别了问题.
ptr = &storage;
*is*
获取this
地址,并赋值
给了this
,在storage
是*(this+0)
,ptr
是*(this+8)
.
this
比this
有更长生命期?添加return scope
到构造函数时,仍然有效.
@safe:
struct S {
int storage;
int* ptr;
this(int dummy) return scope {//加了`中域`.
ptr = &storage;
}
int* get() return scope {
return ptr;
}
}
int* escape() {
S s = S(0);
return s.get; // s栈变量指针逃逸.
}
没关系,它说this
的生命期比"this
变量地址"长,但是,它应在测试套件
中,且带return scope
的修改应该报错.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现