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

从函数返回std::shared_ptr时抛出异常问题求助

解决从函数返回std::shared_ptr时抛出异常的问题

从你给出的代码片段来看,return std::make_shared<ICPResult>(fitnessScore, transformation);抛出异常的原因大概率集中在以下几个方向,咱们逐个拆解排查:

1. 命名空间不匹配的核心问题

注意到你在Icp.h里声明的fit()返回类型是std::shared_ptr<models::detection::ICPResult>,但在Icp.cpp的实现中直接写了ICPResult,没有带上完整的models::detection::命名空间。

如果Icp.cpp里没有通过using namespace models::detection;导入这个命名空间,编译器会默认你要实例化全局命名空间下的ICPResult,而不是你定义的那个继承自DetectionResult的类。这种类型不匹配会导致构造对象时出现未定义行为,进而触发异常。

修复方案:

  • 要么在Icp.cpp开头添加命名空间导入(仅cpp文件推荐这么做):
    using namespace models::detection;
    
  • 要么在make_shared里明确写出完整命名空间:
    return std::make_shared<models::detection::ICPResult>(fitnessScore, transformation);
    

2. ICPResult构造函数的潜在问题

你的ICPResult带参构造函数声明是:

ICPResult(const double score, const Eigen::Matrix4f transformation);

这里有两个需要确认的点:

  • 构造函数是否有正确的实现?如果只有声明没有定义,链接阶段会报错,但如果是运行时抛异常,可能是构造函数内部逻辑出问题了——比如父类DetectionResult的构造函数抛出了异常;
  • 传递的Eigen::Matrix4f是否合法?如果icp.getFinalTransformation()返回的矩阵包含NaN、无穷大值,或者处于未初始化状态,拷贝构造时会触发Eigen内部的断言或异常。

修复方案:

  • 确保构造函数有完整实现,比如正确初始化父类和成员变量:
    ICPResult::ICPResult(const double score, const Eigen::Matrix4f transformation) 
        : DetectionResult(score), transformationIcp(transformation) {}
    
    (假设父类DetectionResult有接受score的构造函数)
  • 在构造对象前,先调试检查fitnessScore和transformation的有效性,比如打印矩阵的所有元素,确认没有异常值。

3. 极端情况:内存分配失败

虽然这种情况很少见,但std::make_shared在系统内存不足时会抛出std::bad_alloc异常。

排查方案:
可以临时添加异常捕获来确认:

try {
    return std::make_shared<models::detection::ICPResult>(fitnessScore, transformation);
} catch (const std::bad_alloc& e) {
    std::cerr << "内存分配失败: " << e.what() << std::endl;
    throw; // 重新抛出以便上层处理
}

快速排查流程

  1. 优先修复命名空间不匹配的问题,这是最常见的根源;
  2. 检查ICPResult构造函数的实现,确认父类初始化、成员变量赋值都正常;
  3. 验证fitnessScore和transformation的数据合法性;
  4. 最后考虑内存分配的极端情况。

内容的提问来源于stack exchange,提问作者David Tošner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:18:37