我在地图迭代器中有错误。问题如下:
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]
的内容)。
答案 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();
}