You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D语言使用emplace模板编译报错,请求技术协助

D语言emplace模板编译错误排查

错误原因分析

  1. class类型的sizeof误解:你代码中的motion是class类型,D语言中class的sizeof返回的是类引用的大小(64位系统通常为8字节),而非对象实例的实际内存大小。因此malloc(motion.sizeof)仅分配了存储一个类引用的内存,完全不足以容纳motion对象实例的数据。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:06:10