2009-08-22 56 views
0

我有一個奇怪的錯誤,我希望更多的經驗程序員可能有一些洞察。我正在使用boost ublas稀疏矩陣,特別是mapped_matrix,並且最終發生了一個間歇性錯誤,但不是程序的初始階段。這是一個大的程序,所以不能發佈所有的代碼,但其核心思想是,我稱之爲屬於一個特定類的函數:訪問提升sparse_matrix元素似乎阻止程序

bool MyClass::get_cell(unsigned int i, unsigned int j) const 
{ 
    return c(i,j); 
} 

變量c被定義爲類的成員

boost::numeric::ublas::mapped_matrix<bool> c; 

當發生錯誤時,程序似乎停止(但不會崩潰)。使用Eclipse進行調試,我可以看到程序進入boost mapped_matrix代碼,並繼續執行幾個級別,分別爲std :: map,std :: _ Rb_tree和std :: less。此外,該程序偶爾追溯到std :: map,std :: _ Rb_tree和std :: _ Select1st。當代碼正在執行,並且_Rb_tree中的內存中的活動行發生更改時,執行似乎不會在std :: map級別返回。 std :: map程序被卡住的行是以下函數的返回值。

const_iterator 
find(const key_type& __x) const 
{ return _M_t.find(__x); } 

在我看來,程序正在尋找的c矩陣中有一些元素,但不知何故底層存儲機制「錯放了它」。但是,我不確定爲什麼或者如何解決這個問題。這也可能完全脫離基地。

任何幫助,你可以提供將不勝感激。如果我沒有在這個問題中包含正確的信息,請讓我知道我錯過了什麼。謝謝。

回答

1

有些事情要嘗試調試代碼(不一定是永久更改):

  • 更改bool在矩陣型的intc,看是否矩陣預計數字類型。
  • 將矩陣類型更改爲具有類似接口的另一個,可能是普通的舊matrix
  • Valgrind應用程序(如果你在Linux上)檢查你是不是在破壞內存。

如果失敗,每次修改矩陣時都可以嘗試調用get_cell以查看可能導致問題的原因。

如果失敗了,您可能需要嘗試將問題簡化爲更小的代碼子集,您可以在此處發佈。

如果您告訴我們您正在使用的編譯器和操作系統,它可能會有所幫助。

+0

謝謝你的建議。我試圖從一個布爾變成一個int併發生同樣的問題。我改成了一個普通的矩陣,問題就消失了,但是如果不使用稀疏矩陣,實際使用速度太慢。 我也試着調用get_cell,但是有很多地方矩陣被修改,我不確定我是否找到了它們。 不幸的是,我不得不使用一種解決方法,並把這個問題放在backburner一段時間。感謝您的建議,如果我能在稍後確定問題,我會發布它。 – RandomGuy 2009-08-25 15:37:38

+0

用valgrind查找泄漏內存解決了這個問題。感謝您的幫助。 – RandomGuy 2009-08-31 21:31:10

0

這是多線程程序的一部分嗎?

我問,因爲通常當我在STL中看到問題時,它最終會成爲未同步訪問的問題。

+0

我最初嘗試使用多線程,但當程序在單個執行線程內運行時存在相同的問題。 – RandomGuy 2009-08-22 03:03:33