我从std :: multimap.lower_bound获得了一个无效指针

时间:2012-10-17 11:10:34

标签: c++ multimap

我使用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");

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

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

1 个答案:

答案 0 :(得分:2)

当我有一个带有std容器的无效迭代器,如map,multimaps,90%的时间,原因是我正在迭代容器,而我正在删除此容器中的项目。

只要在容器中删除某个项目(或者甚至插入某些其他容器中),迭代器的有效状态就会不再保证

编辑:如下面的评论所说,迭代器失效的规则因容器而异。 cf this question

edit2:您没有告诉我们如何取消引用您的迭代器。 你的迭代器是一个std ::对,并且你应该检查返回的迭代器不等于yourContainer.end(),然后再解除它。但是因为你没有向我们展示你反驳迭代器的代码,所以很难说。你没有告诉我们你输出痕迹的方式。