mingw和msvc之间的区别是否正常

时间:2014-08-14 14:19:54

标签: c++ visual-c++ stl mingw

今天我们发现了一个工作中的错误,可以简化为:

std::map<int, Obj*> workMap;

for(auto a : workMap)
{
    workMap.erase(a.first);
} 

实际上,我们调用了函数,它调用了擦除的函数,但它不是重点。

关键是,在我的计算机上使用visual studio编译器我已经列表迭代器不是可递增的错误,而我的mingw同事根本没有错误!

据我所知,我们有不同的编译器和不同的STL实现(可能)。通常情况下,他们可以使用不同的警告或标志来抑制警告。但它是不同的运行时错误行为。这是正常的吗?我可以以某种方式&#34;启用&#34;所有运行时错误?

2 个答案:

答案 0 :(得分:4)

这些类型的for循环不用于更改容器本身。您使仍然使用的迭代器无效,因此可能发生任何事情。由于这是未定义的行为,因此允许编译器生成任何的代码,因此无法保证这一点,因此两个编译器都是正确的。

您的观察是由于msvc默认启用了一些运行时检查调试版本,而gcc没有。

您可以在编译期间使用libstd++-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC(gcc的标准库实现)启用运行时检查。它会在您的示例中显示错误。 (Live

答案 1 :(得分:2)

我们已经清楚了,这段代码:

std::map<int, Obj*> workMap
for(auto a : workMap)
    workMap.erase(a.first);

导致未定义的行为,并且应该可以正常工作。

Visual Studio只是提供帮助,并提供有关此问题的运行时错误。它没有义务这样做。