我為我的問題的模糊標題道歉。我不知道更好的表達方式。我以前從未問過 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;
}
uj5u.com熱心網友回復:
您在堆疊上的函式中創建向量 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490437.html
上一篇:結構指標正在取消參考哪個記憶體?
下一篇:給定向量的指標訪問向量的元素
