在c ++中简单的std :: map迭代的意外输出

时间:2012-11-27 00:34:10

标签: c++ map std

我有点难过,我想的是一些简单的代码。它以前工作,所以我不知道为什么它停止工作。这是一个单线程程序。

    Model *model;
    ModelMap::iterator model_map_iterator;

    cout << this->models.size() << endl;

    for( model_map_iterator = this->models.begin(); model_map_iterator != this->models.end(); model_map_iterator++ ){

        cout << "what" << endl;
        //model = model_map_iterator->second;
        //cout << *model;

    }

    cout << this->models.size() << endl;

这是分别有1,2和4型号时的输出。

$ program
    1
    what
    1

$ program
    2
    what
    what
    2

$ program
    4
    what
    what
    4

正如您所看到的,对于任何数量大于2的模型,“什么”输出的数量是2.我已经尝试过2-5型号。它们都产生两个“what”字符串,但输出正确的std :: map大小。

有人可以帮我找出我做错了吗?

提前致谢...

更新

提交整个代码库进行调试:

https://github.com/homer6/modeler/tree/crudepythonmodeler

提交(00c01ad634df70cc7f67efba96b1503ffd63529c)

这是rawpythonmodeler分支

README.md包含ubuntu的安装步骤

3 个答案:

答案 0 :(得分:1)

我想我找到了答案。

这是ModelMap的typedef:

typedef ::std::map<Utf8String,Model*,Utf8StringComparator> ModelMap;

我粗略地改变了Utf8StringComparator中的签名,以返回int而不是bool。

感谢您对此进行调查。我确定我什么时候确定。

答案 1 :(得分:1)

ModelMap :: iterator可能存在问题。您可能想要修改它的编写方式。

答案 2 :(得分:0)

假设上面的代码打印了引用的结果,很明显ModelMap数据结构在某种程度上被破坏了。腐败几乎肯定发生在调用此函数之前。根据引用的代码和数据,地图如何被完全破坏是不可能的。两个最有可能的候选人是

  1. 某些值的键被更改(假设数据结构确实是地图)。
  2. 内部指针在某些时候被覆盖了。
  3. 我可能会猜测后者虽然这通常导致崩溃而不是某些部分输出。一个潜在的原因可能是被查看的对象恰好是通过函数引用返回的被破坏对象。然而,这几乎是猜测:要找到错误,你需要发布更多代码,删除许多不相关的代码(即,发布数百行代码不会给你一个问题的答案确切地说,上面的代码也不是。