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

Eigen::Map异常表现:直接映射函数返回向量结果错误

直接用返回vector的函数初始化Eigen::Map结果异常,是Eigen的Bug吗?

我遇到一个问题:在Eigen::Map中直接传入返回std::vector的函数调用时,映射结果不符合预期;但先将该vector赋值给变量后再执行映射操作,就能得到正确结果。请问这是Eigen的Bug吗?

示例代码如下:

#include <Eigen/Eigen>
#include <iostream>
#include <vector>

std::vector<double> create_vector(double const a, double const b)
{
    return {a, b, a + b, a * b};
}

int main()
{
    Eigen::Map<const Eigen::Vector<double, 4>>
        eigen_vector_1(create_vector(1.0, 2.0).data());

    std::cout << eigen_vector_1 << std::endl;

    auto const vector = create_vector(1.0, 2.0);

    Eigen::Map<const Eigen::Vector<double, 4>>
        eigen_vector_2(vector.data());

    std::cout << eigen_vector_2 << std::endl;

    return 0;
}

解答

这不是Eigen的Bug,问题出在C++临时对象的生命周期规则上:

  • 当你直接写create_vector(1.0, 2.0).data()时,create_vector返回的是一个临时std::vector对象。根据C++规则,临时对象会在当前完整表达式结束后立即销毁——也就是Eigen::Map构造完成的那一刻,这个临时vector就被销毁了,其内部存储的内存会被释放。此时eigen_vector_1持有的指针变成了野指针,后续访问它的行为属于未定义行为,输出结果自然不符合预期。
  • 而先将vector赋值给变量vector时,这个变量的生命周期覆盖了整个main函数的代码块,直到main结束才会被销毁。因此eigen_vector_2持有的指针始终有效,访问时能得到正确的结果。

要解决这个问题,必须保证Eigen::Map引用的内存,在整个Map的使用周期内都有效,避免直接绑定到临时对象的指针上。

内容的提问来源于stack exchange,提问作者user12422568

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:37:34