d这段代码哪里错了
int[] numbersForLaterUse;
void foo(int[] numbers...) {
numbersForLaterUse = numbers;
}
struct S {
string[] namesForLaterUse;
void foo(string[] names...) {
namesForLaterUse = names;
}
}
他说上面的代码是一个bug,
因为:
“foo()
独立函数和S.foo()
成员函数都错了,因为它们把切片
存储到,自动生成
的仅在执行可变
函数时有效的栈
上的临时数组
.”
问题是,没错啊.
你正在见证未定义行为
的奇妙之处.无效代码
仍然可产生你所希望的结果,或产生垃圾
结果,或崩溃,或完全做其他事情.仅因为运行
一次它做了一件事
,不表明下次运行它也会做一样的.
int[] numbersForLaterUse;
void foo(int[] numbers...) {
numbersForLaterUse = numbers; /*不要,坏的*/
}
void bar()
{
int[3] n = [1, 2, 3];
foo(n);
}
void main()
{
bar();
import std.stdio;
writeln(numbersForLaterUse); /*打印垃圾*/
}
用@safe
标记,看看编译器
输出.再试试:
int[] numbersForLaterUse;
void foo(int[] numbers...) {
numbersForLaterUse = numbers;
}
struct S {
string[] namesForLaterUse;
void foo(string[] names...) {
namesForLaterUse = names;
}
}
void whatwentwrong() {
import std.stdio;
writeln(numbersForLaterUse);
}
void whatelsewentwrong(S s) {
import std.stdio;
writeln(s.namesForLaterUse);
}
void badCodeBad() {
foo(1, 2, 3, 4, 5);
}
S alsoReallyBad() {
S s;
s.foo("hello", "world!");
return s;
}
void main() {
badCodeBad();
whatwentwrong();
auto s = alsoReallyBad();
whatelsewentwrong(s);
}
结论:
(1)
把切片存储
到超过其生存期
的栈位置
不好.
(2)
尽可能使用@safe
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现