2013-01-10 17 views
1

所以我在下面幾行代碼:徵雅可比造成奇數段錯誤在C++

MatrixXd qdash = zeroCentredMeasurementPointCloud_.topLeftCorner(3, zeroCentredMeasurementPointCloud_.cols()); 
Matrix3d H = q * qdash.transpose(); 
Eigen::JacobiSVD<MatrixXd> svd(H, Eigen::ComputeThinU | Eigen::ComputeThinV); 

現在我確信,qdashH正在正確初始化(q也是,只是其他地方)。最後一行,涉及Eigen::JacobiSVD導致程序拋出這個錯誤時,它留給:

Program received signal SIGSEGV, Segmentation fault. 
0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 

0 0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 
1 0xb032a464 in __free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 
2 0xb0329f7d in free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 

I.E.當我試圖釋放它時它是分段錯誤的。現在,按照教程here,都是我應該做的,使用此功能是這樣的:

MatrixXf m = MatrixXf::Random(3,2); 
JacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV); 

有人能看到爲什麼它是在我的情況沒有?

+0

這是整個堆棧跟蹤?你怎麼能確定「最後一行」是否導致SEGFAULT?當我沒有任何明確原因導致應用程序崩潰時,我使用valgrind或eFence工具運行代碼,以確定可能與其相關的弱點或問題。 – janr

+0

什麼是Eigen版本?確保你啓用了斷言測試你的程序,即沒有-DNDEBUG或類似的東西。正如janr所說,堆棧跟蹤顯然不完整。 – ggael

+0

我認爲這是最後一行,因爲如果我將它註釋掉,它會運行程序完成。也是這是造成問題[這裏](http://stackoverflow.com/questions/14190767/identify-variable-causing-memory-error)所以我不能使用valgrind或調試模式相同的錯誤。另外,如果我將問題底部的教程代碼包含到程序中,那麼它會在實際行'JacobiSVD <...'上進行段錯誤,因此我不確定發生了什麼。 –

回答

1

好吧,這是超級瘋狂。原來我使用的是Eigen Alignment,它在我的操作系統上確實不起作用。這導致了一個錯誤,它會根據生成的可執行文件的大小改變位置。

故事的寓意是小心你的包括。