我想从一个函数返回一个 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_size
、max_size
和data
是在栈上本地分配的.然后在 vector 的构造函数中,data
的值被设置为指向动态分配的内存区域以存储 vector 的坐标。当您从 getMesh()
返回时,current_size
、max_size
和 data
在内存中的堆栈位置现在是标记为可用,它们将被覆盖。
您可以做的只是按值返回 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/