0

我使用 std::multimap.lower_bound 方法返回范围结果。但是在容器的相同内容中,有时我得到了错误的迭代器对,它使我的程序崩溃。我可以用visual studio看到容器中的内容,它们都是正确的。而且我使用了multimap的find方法,效果也很好。它只是返回该死的无效迭代器对并使我的程序崩溃,最重要的是,我无法进行任何测试来跳过这种情况。这种情况有什么问题?

我的示例代码如下:

std::multimap<std::string,std::string>::iterator it = tagged_files.lower_bound("vocal");
std::multimap<std::string,std::string>::iterator it_end = tagged_files.upper_bound("vocal");

在大多数情况下,他们运作良好。当我打印itit_end使用 %p(使用 printf)时,它们的结果是 8f98ab9(一个指针值)和 0(同一个键)。当我得到无效的迭代器时,调试消息将显示 8f98ab9(相同值)和 2b8a839(奇怪值)。

此外,大小tagged_files始终相同。在整个会话期间根本没有插入任何项目,即使收到无效的迭代器也是如此。printf %d with 也证明了这一点tagged_files.size()

4

1 回答 1

2

当我在 90% 的情况下使用诸如 map、multimaps 之类的 std 容器的无效迭代器时,原因是我在删除该容器中的项目时正在迭代容器。

一旦一个项目在容器中被移除(或者甚至被插入到其他容器中),迭代器的有效状态就不再得到保证

编辑:就像下面的评论所说,迭代器的无效规则因容器而异。cf这个问题

edit2:你没有向我们展示你如何取消引用你的迭代器。您的迭代器是一个 std::pair,您应该在取消引用之前检查返回的迭代器不等于 yourContainer.end() 。但是由于您没有向我们展示您取消对迭代器的引用的代码,因此很难说。你没有向我们展示你输出痕迹的方式。

于 2012-10-17T11:15:11.397 回答