mingw和msvc之间的这种差异正常吗?

Is such difference between mingw and msvc normal

本文关键字:常吗 msvc 之间 mingw      更新时间:2023-10-16

今天我们在工作中发现了一个bug,可以简化为:

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

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

关键是,在我的计算机上与visual studio编译器,我有列表迭代器是不可递增的错误,而我的同事与mingw没有任何错误!

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

这些类型的for循环不是用来改变容器本身的。您使仍在使用的迭代器失效,因此任何事情都可能发生。因为这是未定义的行为,编译器被允许生成任何的代码,没有任何保证,所以两个编译器都是正确的。

你的观察是由于msvc默认情况下为调试构建启用一些运行时检查,而gcc没有。

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

我们都清楚了,这段代码:

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

导致未定义的行为,应该期望而不是正常工作。

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