【问题标题】:Map iterator error on class assignment类分配上的映射迭代器错误
【发布时间】:2012-07-03 11:49:00
【问题描述】:

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

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] 的指针)。

【问题讨论】:

  • 不能解决您的问题,但以下划线开头后跟大写字母的名称以及以双下划线开头的名称保留用于 C++ 实现。
  • 谢谢。我使用下划线来区分私有,不受公共保护。我会在未来的项目中考虑您的建议
  • 你是否实现了你的拷贝构造函数(和正确的赋值)?从您的 sn-p 中看不出来,因此是一个简单的问题..
  • 如何初始化_L_begin?
  • 不,我没有。我把它留给编译器。当我尝试将 operator= 添加到 JacobianCol 时,我在 xutility xutility(3133) 中遇到了以下错误:错误 C2679: binary '=' : no operator found 它采用 'const JacobianCol 类型的右手操作数'(或没有可接受的转换)

标签: c++ stl map iterator


【解决方案1】:

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();
}

【讨论】:

  • 谢谢。我正在尝试实现这一点。我只是认为还有其他基于编译器的方式:) 谢谢
  • 不幸的是,编译器无法知道您的迭代器需要以不同的方式“复制”。
【解决方案2】:

当你这样做时:

JacobianCol result = Y;

result._L_begin 一直指向 Y._​​col_data.begin()。当 Y 所引用的对象被删除时,result._L_begin 一直指向那个位置,现在这个位置是无效的。

【讨论】:

  • 是的,我已经想通了。我要问的是我该如何处理这种情况。
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多