从函数返回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; // 重新抛出以便上层处理 }
快速排查流程
- 优先修复命名空间不匹配的问题,这是最常见的根源;
- 检查
ICPResult构造函数的实现,确认父类初始化、成员变量赋值都正常; - 验证
fitnessScore和transformation的数据合法性; - 最后考虑内存分配的极端情况。
内容的提问来源于stack exchange,提问作者David Tošner
相关产品推荐
相关产品推荐

