mingw和msvc之间的这种区别是正常的

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

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

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

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

关键是,在我的电脑上使用Visual Studio编译器时,我得到了列表迭代器不是可增加的错误 ,而我的同事与mingw一起没有任何错误!

我明白,我们有不同的编译器和不同的STL实现(可能)。 这是正常的,他们可以有不同的警告或标志来压制警告。 但它是不同的运行时错误行为。 这是正常的吗? 我可以以某种方式“启用”所有运行时错误吗?


这些for循环类型不用于更改容器本身。 你使你仍然使用的迭代器失效,从而发生任何事情。 由于这是未定义的行为,因此编译器可以生成执行任何操作的代码,但没有任何保证,所以这两种编译器都是正确的。

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

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


就这样我们都清楚,这个代码:

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

导致不确定的行为, 应该被预期到正常工作。

Visual Studio只是很有帮助,并提供了一个运行时错误。 这没有义务这样做。

链接地址: http://www.djcxy.com/p/41899.html

上一篇: Is such difference between mingw and msvc normal

下一篇: Create a Mingw DLL to be used with a VB exe