C++ 使用MinGW gcc/g++(nuwen发行版)编译的程序中的运行时错误

C++ 使用MinGW gcc/g++(nuwen发行版)编译的程序中的运行时错误,c++,gcc,mingw,C++,Gcc,Mingw,…生成此输出:这似乎是nuwen发行版的问题。 16.0和16.1版本都会在std::random_设备构造函数上或在值生成期间生成某种未定义的行为,这有时会导致无声崩溃,但很难创建一个简单的示例 当代码在优化级别大于0的情况下编译时,崩溃似乎消失了。 我不相信它,因为UB很可能仍然存在于某个地方,程序可能会在最意想不到的地方崩溃 版本16.0使用GCC 8.1.0,16.1使用GCC 8.2.0。 从下载的MinGW也使用8.1.0版本,我无法复制这个bug 另外,请注意,MinGW上的std

…生成此输出:

这似乎是nuwen发行版的问题。 16.0和16.1版本都会在std::random_设备构造函数上或在值生成期间生成某种未定义的行为,这有时会导致无声崩溃,但很难创建一个简单的示例

当代码在优化级别大于0的情况下编译时,崩溃似乎消失了。 我不相信它,因为UB很可能仍然存在于某个地方,程序可能会在最意想不到的地方崩溃

版本16.0使用GCC 8.1.0,16.1使用GCC 8.2.0。 从下载的MinGW也使用8.1.0版本,我无法复制这个bug

另外,请注意,MinGW上的std::random_设备不会提供随机数-它将是确定性的,总是给出相同的值。不幸的是,标准允许,在我看来这是一个大问题

如果你每次运行只需要不同的值,考虑用其他的,不是随机的源来播种,比如C库中的时间。如果您确实需要非确定性值,可以使用nuwen发行版提供的boost::random::random_设备与std::random_设备相同的接口。但它不仅仅是标题,因此您需要添加额外的链接:


g++foo.cpp-lboost_random-lboost_system

可能共享崩溃消息?我在wandbox.org上尝试了多个GCC版本-没有crashes@TheQuantumPhysicistmyprog.exe已停止工作。问题导致程序停止正常工作。Windows将关闭该程序并通知您是否有可用的解决方案。请注意,GCC在Windows上的std::random_设备历来存在问题-它可能总是产生相同的非随机数。您使用的是哪个GCC版本号?旁注:您可能不需要或不想在每次调用randomBitI时重新设置随机数生成器的种子。我在使用GCC 10.2.1的MCF-GCC发行版时遇到了相同的崩溃。
#include <iostream>
#include <random>

using namespace std;

class myclass
{
    private:

    static bool randomBit()
    {
        std::random_device rd; // Obtain a random seed number from hardware
        std::mt19937 gen(rd()); // Initialize and seed the generator <---- CRASH!!
        uniform_int_distribution<> distr(0, 1); // Define the distribution range

        return distr(gen);
    }

    myclass::myclass() = delete; // Disallow creating an instance of this object

    public:

    static bool generateRandomBit()
    {   
        return randomBit();
    }
};

int main()
{   
    cout<<myclass::generateRandomBit()<<endl;

    return 0;
}
int main()
{   
    int a[2] {0, 0};

    for (int i = 0; i < 1000; i++) {
        a[myclass::generateRandomBit()]++;
    }

    cout<<"<"<<a[0]<<", "<<a[1]<<">"<<endl;

    return 0;
}