使用“std::cout”打印相同指针的连续行产生完全不同的输出

杰基·卡森

我为我的问题的模糊标题道歉。我不知道更好的表达方式。我以前从未问过 Stack Overflow 问题,但这个问题让我完全难过。

类中的方法Chunk使用 Eigen 线性代数库生成 vector3f,然后将其映射到具有以下内容的 C 样式数组。

ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);

float *fit = x.data();
return fit;

该数组在主函数中返回和访问。但是,每当我尝试从指针中打印出一个值时,都会得到完全不同的结果。下面是一个示例。

Chunk test = Chunk(CHUNK_SIZE, 0, 0, 1, poBand);
float* fit = test.vector;  // Should have size 3
std::cout << fit[0] << std::endl; // Outputs 3.05 (correct)
std::cout << fit[0] << std::endl; // Outputs 5.395e-43
std::cout << fit[0] << std::endl; // Outputs 3.81993e+08

使这个问题更加令人困惑的是,当我以“\n”或“,”结束行时,错误的值会发生变化。无论我打印索引 0、1 还是 2,第一个值始终是预期值。

我已经尝试为 fit 变量动态分配内存,以及在这个 answer上实现代码,但没有一个会改变这个功能。

预先感谢您对此问题的任何指导。

最小可重现示例:

float* getVector() {
    Eigen::Vector3f x;
    x << 3, 5, 9;

    float* fit = x.data();
    return fit;
}

int main(void) {
    float* fit = getVector();

    std::cout << fit[0] << std::endl;
    std::cout << fit[0] << std::endl;
    std::cout << fit[0] << std::endl;
}
马吕斯

您在堆栈上的函数中创建向量 x 。它在函数退出后被销毁。因此,您的指针无效。

这里有一个 shared_ptr 的例子

ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);
shared_ptr<float> fit(new float[3],std::default_delete<float[]>());
memcpy(fit,x.data(),sizeof(float)*3);
return fit;

另一种可能的方式是

ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);
return x;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法使用std :: cout打印/输出任何内容

CMake并使用不同的标志进行连续运行会产生相同的输出

如何使用.replace()和.substring()修复完全不同的输出?

使用 std::cout 打印 #define 宏

使用lpr打印pdf与打印GUI产生不同的输出

C ++-最佳实践:`使用std :: cout`与`std :: cout`

当在MathProg中无法使用LP时,打印完全不同的内容

余弦相似性和使用相同来源的完全不同的结果

如何使用std :: cout或std :: ofstream作为单个函数的输入?

使用 std::ostream 和 std::cout 的 C++ 日志记录

如何临时使用 std::cout 代替 std::ofstream

std :: begin和std :: end无法使用指针并引用原因?

std :: cout从qDebug提供不同的输出

如何使用std :: partial_sum并输出到std :: map?

打印std :: strings不产生任何输出

C++ 错误:对 `std::cout` 无效使用 '::'

使用QTextStream停止std :: cout工作

使用lambda作为std :: cout的参数

使用stringstreams加快std :: cout日志记录

使用std :: cout添加时间戳

连续使用 std::list 导致崩溃

使用直接初始化与std :: initializer_list时的不同指令

使用指针访问std :: string中的元素

相同的表达式产生完全不同的结果

使用iostream(std :: wcout)打印CComBSTR

使用std :: ostream作为打印函数的参数

如何使用 std::ostringstream 检查输出?

使用std :: filesystem输出作为LPCWSTR

尝试使用 std::copy() 和 std::back_inserter 从 std::cin 读取时的不同结果