0

マップイテレータにエラーがあります。問題は次のとおりです。

class JacobianCol
{
private:
...
    JacobianColData::iterator _L_begin;
public:
    JacobianColData::iterator L_begin();
...
};

別のモジュール:

JacobianCol LUSolver::col_subtract(const JacobianColData::iterator &alpha, JacobianCol &X, JacobianCol &Y)
{
    JacobianCol result = Y;

    //alternate "result" variable

    return result;
}

電話:

...
J[*it] = col_subtract(friend_element, J[diag_index], J[*it]);
...

そして、の結果をに割り当てるcol_subtractと、割り当てが解除されたメモリ(前のメモリへのポインタ)を指すようになりJ[*it]ます。J[*it].L_beginJ[*it]

4

2 に答える 2

0

あなたがするとき:

JacobianCol result = Y;

result._L_begin は Y._col_data.begin() を指し続けます。Y が参照しているオブジェクトが削除されると、result._L_begin はその場所を指し続けますが、現在は無効になっています。

于 2012-07-03T12:09:45.030 に答える
0

JacobianCol には _col_data メンバーがあります。つまり、入力インスタンス JacobianCol Y には _col_data インスタンスがあり、これの _L_Begin はそのマップの反復子で初期化されます。結果を返すと、別の _col_data メンバーが作成されます。これで、_L_Begin イテレータが元の Y インスタンスからコピーされます。そのため、観察された動作が得られます。

これを解決するには、コピー コンストラクターを実装し、マップをコピーして、コピー コンストラクターで _col_data.begin() を明示的に呼び出して反復子を再初期化します。

JacobianCol(const JacobianCol& aSrc_in)
{
    _coll_data = aSrc_in._coll_data;
    _L_Begin = _coll_data.begin();
}
于 2012-07-03T12:14:03.810 に答える