在类赋值上映射迭代器错误

时间:2012-07-03 11:49:01

标签: c++ stl map iterator

我在地图迭代器中有错误。问题如下:

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_begin指向已解除分配的内存(指向前一个J[*it]的内容)。

2 个答案:

答案 0 :(得分:0)

当你这样做时:

JacobianCol result = Y;

result._L_begin继续指向Y._col_data.begin()。当删除Y为引用的对象时,result._L_begin会一直指向该位置,该位置现在无效。

答案 1 :(得分:0)

JacobianCol有_col_data成员。即,输入实例JacobianCol Y具有_col_data实例,并且_L_Begin使用该映射的迭代器初始化。返回结果时,会创建一个不同的_col_data成员。现在,从原始Y实例复制_L_Begin迭代器。这就是你得到观察到的行为的原因。

要解决此实现复制构造函数,复制映射并通过在复制构造函数中显式调用_col_data.begin()来重新初始化迭代器

JacobianCol(const JacobianCol& aSrc_in)
{
    _coll_data = aSrc_in._coll_data;
    _L_Begin = _coll_data.begin();
}