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_subtractto时,J[*it]我会J[*it].L_begin指向一个已释放的内存(指向上一个的指针J[*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 回答