1

奇妙な実行時エラーについて助けが必要です。それを与えるコードは次のとおりです。

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];
};

ヤコビ列:

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;
}
4

1 に答える 1

3

あなたのコードはまともなコンパイラでさえコンパイルされません。 diagonal_element 参照ではなく、値にする必要があります。参照を一時的に初期化することはできません。

(イテレータには値のセマンティクスがあり、イテレータへの参照が必要なケースはほとんどなく、ほとんどの場合、パラメータとして使用されます。)

于 2012-06-25T07:59:21.943 に答える