2012-06-25 4 views
1

Мне нужна помощь с необычной ошибкой во время выполнения. Вот код, который дает ему:STL map итератор ошибка времени выполнения

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 переменная итератор идет вниз. Указатель на память остается (я проверил это в отладчике), но содержимое итератора искажается (переменная без ссылок).

Что я делаю неправильно?

немного кода:

якобиан 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 (ключ); 'возвращает' end() '? Если вызывающий абонент разыскивает его, это вызывает неопределенное поведение. – hmjd

ответ

3

Ваш код даже не будет компилироваться с достойным компилятором. diagonal_element не должно быть ссылкой, а значением. Вы не можете инициализировать ссылку с временным.

(итераторы имеют семантику значений, и есть очень, очень мало случаев , где вы хотите ссылку на итератор —, а затем почти всегда в качестве параметра.)

+0

Спасибо, Джеймс Канзе. Это помогло –

Смежные вопросы