2012-06-25 39 views
1

我需要關於奇怪運行時錯誤的幫助。這裏給出它的代碼:STL映射迭代器運行時錯誤

JacobianCol &diag_index_column = J[diag_index]; 
JacobianColData::iterator &diagonal_element = diag_index_column.find(diag_index); 
Jacobian J2 = J; //added to reveal the problem 
J[diag_index].divide_by(diagonal_element); 

我想要什麼。我想保存迭代器diagonal_element並將其傳遞給divide_by函數。但是當我調用J變量時,迭代器就會關閉。指向內存的指針保持不變(我在調試器中檢查過),但迭代器的內容損壞(未引用的變量)。

我在做什麼錯?

更多的代碼:

雅可比記者:

class Jacobian 
{ 
private: 
    std::vector<JacobianCol> _J; 
... 
public: 
... 
    JacobianCol& operator [](int i); //return _J[i]; 
}; 

JacobianCol:

typedef std::map<int, Submatrix> JacobianColData; 

class JacobianCol 
{ 
private: 
... 
JacobianColData _col_data; 
public: 
... 
JacobianColData::iterator &find(int key, bool need_append = false); 
}; 

發現執行:

JacobianColData::iterator &JacobianCol::find(int key, bool need_append) 
{ 
if(need_append) 
    this->insert(key); 
JacobianColData::iterator &res = this->_col_data.find(key); 
return res; 
} 
+1

如果'這 - > _ col_data.find (key);'returns'end()'?如果調用者將其解引用,它會導致未定義的行爲。 – hmjd

回答

3

你的代碼甚至不會用一個體面的編譯器編譯。 diagonal_element 不應該是一個參考,而是一個值。您無法使用臨時初始化 引用。

(迭代器有值語義,並且有要一個iterator —參考極少,極少的情況下 ,然後幾乎總是 作爲參數。)

+0

謝謝你,詹姆斯Kanze。它有幫助 –