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

I got an invalid pointer from std::multimap.lower_bound

本文关键字:获得了 无效 bound 指针 std multimap lower 我从      更新时间:2023-10-16

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

我的示例代码如下:

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()证明。

当我有一个带有标准容器(如MAP,Multimaps,90%的时间)的std容器的无效迭代器时,原因是当我在该容器中删除项目时,我在容器上迭代。

一旦删除了一个项目(甚至在其他容器中插入),则有效的迭代状态为不再保证

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

edit2:您不会向我们展示如何解除迭代器。您的迭代器是std :: pair,您应该检查返回的迭代器在放置之前不等于your container.end()。但是,由于您不向我们展示您的代码,因此很难说出迭代器。您不会向我们展示输出轨迹的方式。