0

我正在从 Visual Studio 2008 -> 2010 转换,在评估 std::set 指针上的查找时,我在代码中遇到了一个奇怪的错误。

我知道这个版本带来了一个变化,其中 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
    }
}

PS m_mustFindStops 崩溃时为空。

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

4

1 回答 1

1

我唯一能想到的是你有多个线程,m_mustfindStops实际上是一个成员或全局变量,而不是这个函数的局部变量。如果正确并孤立地考虑,上面的代码不可能导致问题。

如果你有多个线程,那么读访问与写访问并发会导致随机错误——即使容器看起来是空的,它也可能不是在find调用开始时出现的。

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

顺便说一句 - 在 Visual C++ v10 中绝对没有问题std::set- 你的代码一定有错误。

于 2010-11-24T03:28:55.990 回答