c++ - 从函数中通过引用返回 Eigen::VectorXd

标签 c++ return eigen

我想从一个函数返回一个 Eigen::Vector 并想知道什么是正确的方法。有点像

Eigen::VectorXd& getMesh(int N) {
    Eigen::VectorXd mesh(N + 1);  // nb. of nodes
    // Nodes are equally spaced
    for (int i = 0; i < N + 1; i++) {
        mesh[i] = i * (1.0 / N);
    }

    return mesh;
}

int main() {
    // Mesh with 100 cells
    Eigen::VectorXd mesh = getMesh(100);

    return 0;
}

当然,我们可能会在这里遇到问题,因为用于在 getMesh() 中创建网格 vector 的内存可能不是动态分配的,即当我们从函数返回时,引用“指向”已删除的内存。

我可以在 main 函数中分配内存,然后将其传递给 getMesh 函数,但这样可以吗?我还有哪些其他可能性?

最佳答案

不得返回对函数局部变量的引用。这称为 dangling reference .请注意,当您执行此操作时,您的编译器应该给您一个警告:例如 Visual Studio。

warning C4172: returning address of local variable or temporary: mesh

当前 getMesh() 函数的问题是局部变量 mesh 在函数执行过程中被分配到堆栈上。然后在 main 中返回对它的引用,但是当 getMesh() 函数退出时,分配 mesh 的堆栈内存被释放。这意味着它很可能会被程序中以后的数据覆盖。

请注意,即使用于存储坐标的内存存储在您的 vector 中,也会发生此问题。您的 mesh 变量是具有多个成员变量的类 (VectorXd) 的实例。其中一个是 vector 的大小,另一个是指向 vector 数据动态分配存储的指针。

这是 VectorXd 定义的示例

class FakeVectorXd {
    int current_size;
    int max_size;
    double* data;
};

当你创建mesh时,成员变量current_sizemax_sizedata是在栈上本地分配的.然后在 vector 的构造函数中,data 的值被设置为指向动态分配的内存区域以存储 vector 的坐标。当您从 getMesh() 返回时,current_sizemax_sizedata 在内存中的堆栈位置现在是标记为可用,它们将被覆盖。

您可以做的只是按值返回 VectorXd。这很好:

Eigen::VectorXd getMesh(int N) {
    Eigen::VectorXd mesh(N + 1);
    for (int i = 0; i < N + 1; i++) {
        mesh[i] = i * (1.0 / N);
    }
    return mesh;
}

关于c++ - 从函数中通过引用返回 Eigen::VectorXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62918439/

相关文章:

c# - 如何在对话框打开时禁用拖放

c++ - 如何从 'normal' IDirect3D9Surface 获取离屏平面

c++ - 内联函数时的编译器限制

return - 如何从 raku sub 返回 2 个哈希?

C++ 递归不返回期望值

c++ - 由于固定大小的成员而导致的 Eigen 运行时断言

c++ - 为什么要使用 mem_fn?

c - 反转字符串的函数将字符串更改为空,而不是反转

c++ - 我可以使用 Eigen 求解线性方程组,形式为 Ax = b,A 是稀疏的吗?

c++ - 初始化的 Array 构造函数有什么作用?