C++ visualc&x2B+;2010标准::设置查找已断开

C++ visualc&x2B+;2010标准::设置查找已断开,c++,visual-studio-2010,stl,visual-c++-2010,C++,Visual Studio 2010,Stl,Visual C++ 2010,我从VisualStudio2008->2010转换过来,在对std::指针集的查找进行评估时,我在代码中遇到了一个奇怪的错误 我知道这个版本带来了一个变化,即set::iterator与set::const_iterator具有相同的类型,以实现与标准的一些兼容性。但我不明白为什么这段代码以前有效,现在却导致崩溃 void checkStop(Stop* stop) { set<Stop*> m_mustFindStops;

我从VisualStudio2008->2010转换过来,在对std::指针集的查找进行评估时,我在代码中遇到了一个奇怪的错误

我知道这个版本带来了一个变化,即set::iterator与set::const_iterator具有相同的类型,以实现与标准的一些兼容性。但我不明白为什么这段代码以前有效,现在却导致崩溃

void checkStop(Stop* stop)
{
    set<Stop*>                      m_mustFindStops;
    if (m_mustFindStops.find(stop) != m_mustFindStops.end()) // this line crashes for some reason??
    {
         // do some stuff
    }
}
void checkStop(停止*Stop)
{
设置m_mustFindStops;
如果(m_mustFindStops.find(stop)!=m_mustFindStops.end())//由于某种原因,此行崩溃??
{
//做点什么
}
}
PS m_mustFindStops在崩溃时为空


编辑:谢谢你的快速回复。。。我也不能用一个简单的例子来复制它——这可能不是集合本身的问题。我认为堆损坏可能是罪魁祸首——我只是希望知道为什么更改编译器会突然导致相同代码和相同输入数据的损坏

我唯一能想到的是,您有多个线程,
m_mustfindStops
实际上是一个成员或全局变量,而不是此函数的局部变量。如果正确且单独使用,上述代码不可能导致问题

如果您有多个线程,那么读访问与写访问并发将导致随机错误-即使容器看起来是空的,也可能不是在
find
调用启动时

另一种可能是其他一些代码损坏了堆,在这种情况下,使用堆内存的任何代码都可能出现故障。考虑到这一点,如果总是这种逻辑被打破,我的赌注将是线程问题


WT> >代码> STD::在VisualC++ V10中设置< <代码> -您的代码必须有bug。< /P>不可复制。请发布一个完整的、可编译的示例。我无法重现错误。这表明还有其他问题。最小的可编译示例可以重现错误,我们可以运行它,这将是完美的。我不断惊讶于有人在发现问题时,认为错误存在于MSVC(全球数百万人已经对MSVC进行了测试)中,而不是他们自己的代码中(这已经被一个人测试过了,如果有的话)。没有尝试一下你@Jamie(这真的只是和你的标题有关-文本本身表明你可能认为这个bug是你的),我只是觉得它很有趣。也许你应该在网上搜索“认知失调”——“射中你的脚,然后责怪枪”这是我听过的最好的解释:-)我没有说MSVC有问题,只是我知道它已经改变了,也许我还没有完全理解它的变化。@Jamie:但是你的标题说
std::set
坏了,这不是;)应用程序的某些部分是多线程的,但所讨论的部分不是。关于如何追查腐败罪犯有什么想法吗?@Jamie:编译器设置的警告级别是多少?它编译时没有警告吗?您是否使用了智能指针而不是原始指针。是否使用了at()而不是运算符[]?您是否使用过产品来测试堆边界(如valgrind)。它被设置为3级,警告被视为错误。通常使用智能指针,我们的策略是对向量使用.at()。以前没有用过valgrind。。。我得开始了thinks@Jamie:据我所知,valgrind不能在Windows上使用,希望你手边有一个Linux设备。啊,是的。。。好吧,那就不会发生了——应用程序绝对是windows版的。谢谢你