2

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

    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 的模型,“what”输出的数量为 2。我已经尝试了 2-5 个模型。它们都产生两个“what”字符串,但输出 std::map 的正确大小。

谁能帮我找出我做错了什么?

提前致谢...

更新:

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

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

提交(00c01ad634df70cc7f67efba96b1503ffd63529c)

这是粗略的pythonmodeler 分支

README.md 包含 ubuntu 的安装步骤

4

3 回答 3

1

我想我找到了答案。

这是 ModelMap 的 typedef:

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

我草率地将 Utf8StringComparator 中的签名更改为返回 int 而不是 bool。

感谢您对此进行调查。当我确定时我会确认。

于 2012-11-27T01:03:45.657 回答
1

可能是 ModelMap::iterator 的问题。您可能想修改这是如何编写的。

于 2012-11-27T03:34:17.737 回答
0

假设上面的代码打印出引用的结果,很明显ModelMap数据结构以某种方式被破坏了。几乎可以肯定,损坏发生在调用此函数之前。根据引用的代码和数据,无法准确判断地图是如何损坏的。最有可能的两个候选人是

  1. 一些值的键发生了变化(假设数据结构确实是一个映射)。
  2. 内部指针在某些时候被覆盖。

我可能会猜测后者,尽管这通常会导致崩溃而不是部分输出。一个潜在的原因可能是正在查看的对象恰好是函数引用返回的销毁对象。然而,这几乎都是猜测:要找到错误,您需要发布更多代码,同时删除许多不相关的代码(即,发布数百行代码不会给您答案问题在哪里确切地说,上面的代码也不会)。

于 2012-11-27T00:53:27.853 回答