以下示例是否将创建一个悬空引用? (由于[C0]在函数中是本地的,并且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
是,在CreateMatrix方法中有一个对向量'数据'的悬挂引用,因为它是在本地实例化的(在方法中),然后通过引用传递给Eigen :: Map构造函数。若要解决此问题,Eigen :: Map应该拥有向量,或者必须在更大范围内(在CreateMatrix方法之外)定义向量。
您从CreateMatrix()调用返回的席子保存的是临时std :: vector的地址,该地址超出了该函数的范围。无法保证该地址仍会保留您想要的内容。您需要使std :: vector更永久。它必须存在于CreateMatrix()之外,否则您将遇到麻烦。