C++ 调用std::map::find时“map/set迭代器不兼容”
C++0x11有点像。你知道,微软,还有所有…,VisualStudio2010SP1,Windows7企业版 我有一个函数:C++ 调用std::map::find时“map/set迭代器不兼容”,c++,visual-studio-2010,map,c++11,iterator,C++,Visual Studio 2010,Map,C++11,Iterator,C++0x11有点像。你知道,微软,还有所有…,VisualStudio2010SP1,Windows7企业版 我有一个函数: // typedef boost::variant</*stuff*/> value_t; // typedef unsigned short key_t // typedef std::map<key_t, value_t> map_t value_t find(const key_t key, const map_t &map) {
// typedef boost::variant</*stuff*/> value_t;
// typedef unsigned short key_t
// typedef std::map<key_t, value_t> map_t
value_t find(const key_t key, const map_t &map)
{
const map_t::const_iterator iter(map.find(key));
// ...More stuff and then return.
}
在std::map::find的主体中,有一个迭代器比较,我得到的错误消息是map/set迭代器不兼容,如VC\include\xtree:321中定义的。这个错误的本质是来自两个不同容器的迭代器被相互比较,但是错误来自容器自己的find函数!!!反过来说,另一个容器的迭代器可能来自哪里
好的,症状:
这是一个线程应用程序。
它只发生在运行时,在实际应用程序的随机压力测试期间。
我们没有看到任何类型的无效或明显的垃圾字段。
我向广大社区提出的问题:
假设这是线程环境中的一个计时错误,那么在这个过程的中途对映射的内部状态的更改是否可以修改模板类_Tree_const_iterator::_Getcont的值?我假设在这个线程中的查找完成之前,地图正在被清除并重新填充到另一个线程中。单凭这一点就可以做到吗?或者交换或移动操作如何
我将追踪丢失的互斥锁或其他任何东西,我只是想确保我理解所有可能的方法,我可以进入这种状态,鉴于这种情况
假设这是线程环境中的计时错误
那么所有的赌注都输光了。如果您的代码是线程化的,并且不是线程安全的,那么您可能会遇到各种各样的错误。map不是线程安全的,当它被修改时,你不能访问它,所以你可能会得到很多种错误
在假设其他错误之前,确保代码是线程安全的
假设这是线程环境中的计时错误
那么所有的赌注都输光了。如果您的代码是线程化的,并且不是线程安全的,那么您可能会遇到各种各样的错误。map不是线程安全的,当它被修改时,你不能访问它,所以你可能会得到很多种错误
在假设其他错误之前,请确保您的代码是线程安全的。很可能是由于在执行查找时对映射进行了修改而导致了未定义的行为……我同意,在一个线程中更新映射,而在另一个线程中使用“查找”进行搜索时,这看起来像是一个问题。更可能是一个错误无效的迭代器,而不是另一个容器的迭代器,这是由find从中读取时映射发生更改引起的。如果地图从一个线程更改,而另一个线程访问它,那么几乎任何事情都可能出错。我在上个小时遇到过类似的情况,唯一的区别是所有内容都在主线程中运行。问题发生在gcc和VS2010上。在运行完全清理和重建后,两个编译器的问题都消失了。很可能是由于在执行查找时对映射进行了修改而导致了未定义的行为…我同意这看起来像是在一个线程中更新映射,而在另一个线程中使用find进行搜索时出现的问题。更可能是无效的迭代器,而不是另一个容器的迭代器,这是由find从中读取时映射发生更改引起的。如果地图从一个线程更改,而另一个线程访问它,那么几乎任何事情都可能出错。我在上个小时遇到过类似的情况,唯一的区别是所有内容都在主线程中运行。问题发生在gcc和VS2010上。在运行了一次彻底的清理和重建后,两个编译器的问题都消失了。