DMD v2.111.0中Variadic function(可变参数函数)工作异常?
DMD v2.111.0中可变参数构造函数的异常行为分析与修复
问题根源
你的代码里类P(T)的构造函数参数声明存在语法误用:
this (T[] ts...) { this.ts = ts; }
这里的T[] ts...表示接受任意数量的T[]类型参数,但你调用new C(S(0))时传入的是单个S结构体实例。D编译器会尝试隐式转换,把临时生成的S(0)的内存空间当成T[]切片(64位系统下切片由指针+长度组成,占16字节),这直接导致this.ts指向了已销毁的临时对象内存,后续访问时读取到的都是随机垃圾值,属于典型的野指针访问问题。
修复方案
把构造函数的参数改为接受任意数量的T类型参数,正确的可变参数写法如下:
class P(T) { T[] ts; this (T ts...) { // 去掉参数类型后的[],直接以T作为可变参数的基础类型 this.ts = ts; } }
修改后,调用new C(S(0))时,传入的单个S实例会被自动打包成T[]切片赋值给this.ts,后续访问ts[0].n就能得到预期的0值。
验证结果
修复后运行代码,所有writeln的输出都会符合预期:
[S(0)] 0 S(0) 0 [S(0)] 0 0 0
是否为已知Bug?
这不是DMD的Bug,完全是代码对可变参数语法的误用。可变参数...的作用是将多个同类型参数打包成数组,当你声明T[] ts...时,要求传入的参数必须是T[]类型而非T类型,隐式转换引发的野指针访问属于代码逻辑错误。
内容的提问来源于stack exchange,提问作者L Y
相关产品推荐
相关产品推荐

