对函数中创建的Eigen :: Matrix的C ++悬挂引用

问题描述 投票:0回答:2

以下示例是否将创建一个悬空引用? (由于[C​​0]在函数中是本地的,并且vector<int>使用对此数据的引用)。还考虑了Foo构造函数对MatrixXi的引用。

MatrixXi

编辑:

添加了#include <Eigen/Dense> #include <Eigen/Core> using Eigen::MatrixXi; static Eigen::MatrixXi CreateMatrix() { std::vector<int> data(4); data = { 1, 2, 3, 4 }; Eigen::MatrixXi mat = Eigen::Map<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(&data[0], 2, 2); return mat; } class Foo { public: const MatrixXi matrix; Foo(const MatrixXi &matrix) : matrix(matrix) {} void Bar() { std::cout << matrix << std::endl; } }; int main() { Foo test(CreateMatrix()); test.Bar(); Foo* test2 = new Foo(CreateMatrix()); test2->Bar(); std::cin.get(); delete test2; } 以释放内存。

以下示例是否将创建一个悬空引用? (由于vector 在函数中是局部的,并且MatrixXi使用对此数据的引用)。还考虑Foo构造函数...

c++ eigen
2个回答
0
投票

是,在CreateMatrix方法中有一个对向量'数据'的悬挂引用,因为它是在本地实例化的(在方法中),然后通过引用传递给Eigen :: Map构造函数。若要解决此问题,Eigen :: Map应该拥有向量,或​​者必须在更大范围内(在CreateMatrix方法之外)定义向量。


0
投票

您从CreateMatrix()调用返回的席子保存的是临时std :: vector的地址,该地址超出了该函数的范围。无法保证该地址仍会保留您想要的内容。您需要使std :: vector更永久。它必须存在于CreateMatrix()之外,否则您将遇到麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.