C ++ Vector迭代器不兼容,但迭代器似乎对我有效

时间:2014-05-05 23:12:02

标签: c++ object vector iterator

首先在这里发帖,这是我第一次自己提出问题:我已经找到了答案,但我找不到答案。

我收到错误" Expression: vector iterators incompatible"在使用Visual Studio 2013的调试模式下。这个错误的通常原因是在for中,迭代器不指向同一个对象,或者因为循环期间的重新分配而导致结束迭代器无效,但是这里我没有&#39看到类似的东西......

错误发生在我的LogicFormula类的复制构造函数中:

struct LogicFormula {
  id_t ID;
  type_t type_formula;
  operator_t type_operator;
  bool bool_value;
  std::string name;
  ListOfConstants *list_of_constants;
  std::vector<LogicFormula*> children;

  LogicFormula(const LogicFormula &original) {
    type_formula = original.type_formula;
    type_operator = original.type_operator;
    bool_value = original.bool_value;
    name = original.name;
    for (std::vector<LogicFormula*>::const_iterator it =
      original.children.cbegin(); it != original.children.cend(); ++it)
      children.push_back(new LogicFormula(**it));
    if (original.list_of_constants)
      list_of_constants = new ListOfConstants(*(original.list_of_constants));
    else
      list_of_constants = NULL;
  }

  LogicFormula(bool value) {
    type_formula = PROPOSITIONAL_CONSTANT;
    type_operator = LEAF;
    bool_value = value;
    list_of_constants = NULL;
  }

  // [...]
};

在以下行检测到错误:

for (std::vector<LogicFormula*>::const_iterator it =
  original.children.cbegin(); it != original.children.cend(); ++it)

我做了一个引发错误的最小主函数:

int main ( int argc, char* argv[] ) {

    LogicFormula a(true);
    a = testLogic();
    return 0;
}

我希望我能给你一切,如果我的英语不好,我很抱歉:我是法国人。

编辑:对不起,我忘了给testLogic函数了:

LogicFormula testLogic(void) {
    LogicFormula f(true);
    return f;
}

然后由return f;

调用复制构造函数

仅供参考,id_ttype_toperator_t是枚举类型(在LogicFormula类中使用枚举声明),大写字符事物只是这些类型的常量(工作正常)在程序的其余部分)和ListOfConstants是另一个类,但我不认为这很重要,实际上在这个测试中,向量original.children为空,original.list_of_constraints为NULL。 。 并且错误是运行时错误,它编译得很好......

1 个答案:

答案 0 :(得分:0)

我执行了您的代码(不包括某些变量,例如idtype_formula),没有任何问题。你确定main中的代码是你所拥有的吗?

问题可能出在这一行:

 a = testLogic();

请注意,assignment不是copy。因此,该语句将使用编译器生成的operator=用于类LogicFormula,而不是使用copy constructor。默认operator=将逐位复制list_of_constantschildren,而不是循环访问容器。 f中的testLogic将被销毁,list_of_constantschildren也将被销毁。因此,在作业a之后会有无效成员。

另一个问题可能是你没有在构造函数中初始化childrentestLogic的返回值将使用copy constructor复制,{I}}将尝试访问children