【问题标题】:Unexpected output for simple std::map iteration in c++c++ 中简单 std::map 迭代的意外输出
【发布时间】:2025-02-28 04:15:03
【问题描述】:

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

    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 的安装步骤

【问题讨论】:

  • 我怀疑这是有问题的代码。
  • 我已经检查过很多次了。当我更改代码时,输​​出会发生变化。这肯定是有问题的代码。
  • 如果不是很大,你能把整个东西贴出来吗?
  • 更改此代码时输出发生变化并不意味着此代码有问题。
  • 几乎可以肯定该错误存在于您尚未粘贴的代码中。您可以从 valgrind 开始测试。

标签: c++ map std


【解决方案1】:

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

【讨论】:

  • 本帮助纠正这个错误。请参阅我的答案以获得完整的解释。
【解决方案2】:

我想我找到了答案。

这是 ModelMap 的 typedef:

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

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

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

【讨论】:

  • 已确认。这确实是问题所在。
【解决方案3】:

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

  1. 某些值的键已更改(假设数据结构确实是一个映射)。
  2. 内部指针有时会被覆盖。

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

【讨论】:

  • 感谢您的回复。我已将整个代码库添加到 github。我也会检查一下这些具体错误。
  • 正如我所说,“发布数百行代码不会为您提供问题所在的答案”!