C ++ 0x11(您知道,Microsoft,以及所有......),Visual Studio 2010 SP1,Windows 7 Enterprise。
我有一个功能:
// 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 iterators incompatible”,如VC \ include \ xtree:321中所定义。这个错误的本质是来自两个不同容器的迭代器相互比较,但错误来自容器自己的查找函数中的 !!! 重新启动,另一个容器的迭代器可能会在哪里来从
好的,症状:
我对更大社区的问题:
假设这是一个在线程环境中的计时错误,可以改变映射的内部状态,在这个过程中途,修改模板类_Tree_const_iterator :: _ Getcont()的值是什么?我假设在此线程中的查找完成之前,正在清除并重新填充另一个线程中的映射。可以这样做吗?或者交换或移动操作怎么样?
我会追踪丢失的互斥锁或其他什么,我只是想确保我理解所有可行的方法,我可以进入这种状态,给定这个背景。
答案 0 :(得分:5)
假设这是线程环境中的计时错误
然后所有的赌注都关闭了。如果您的代码是线程化的并且不是线程安全的,那么您可以获得各种错误。 std::map
不是线程安全的(在修改时你无法访问它),所以你可能会遇到很多种错误。
在假设其他错误之前,请确保您的代码是线程安全的。