D语言使用emplace模板编译报错,请求技术协助
D语言emplace模板编译错误排查
错误原因分析
- class类型的sizeof误解:你代码中的
motion是class类型,D语言中class的sizeof返回的是类引用的大小(64位系统通常为8字节),而非对象实例的实际内存大小。因此malloc(motion.sizeof)仅分配了存储一个类引用的内存,完全不足以容纳motion对象实例的数据。 - emplace对class的用法错误:
std.conv.emplace针对class和struct的用法存在本质区别:- 对于struct,emplace可以在已分配的内存块上直接构造实例;
- 对于class,emplace的正确用法是接收一个指向类引用的指针,自动完成内存分配与对象初始化,而非手动传入malloc的内存指针。
解决方案
方案1:直接使用new创建对象(推荐,无需手动管理内存)
修改getMotion方法为:
motion getMotion(double step) const{ return new motion(velocity, gravity, angle, step); }
方案2:手动管理内存(仅在特殊需求下使用)
若必须手动控制内存分配,需先获取class实例的实际大小,再手动构造对象:
motion getMotion(double step) const{ // 获取motion对象实例的实际内存大小 size_t instanceSize = motion.classinfo.init.length; auto mem = malloc(instanceSize); if (!mem) throw new Exception("Memory allocation failed"); // 将内存转换为motion对象指针并调用构造函数 auto obj = cast(motion)mem; obj.__ctor(velocity, gravity, angle, step); return obj; }
注意:使用此方案时,后续需要手动调用
obj.__dtor()和free(obj)来释放资源,否则会导致内存泄漏。
额外提示
如果你的场景不需要类的继承特性,将motion改为struct类型,原代码的emplace用法即可正常工作(struct的sizeof返回实例的实际大小,emplace可直接在malloc的内存上构造)。
内容的提问来源于stack exchange,提问作者TCA 166
相关产品推荐
相关产品推荐

