c++ - 使用 MinGW gcc/g++ (nuwen distro) 编译的程序中的运行时错误

标签 c++ gcc mingw

#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;
}

使用 MSVC 编译和运行没有问题。它编译没有错误 gcc但是 mt19937 gen(rd());行导致程序崩溃并显示以下消息:

“myprog.exe 已停止工作

一个问题导致程序停止正常工作。如果有可用的解决方案,Windows 将关闭该程序并通知您。”

有什么想法吗?

gcc 命令:g++ mycode.cpp -fpermissive -s -o myprog.exe


更新: 添加-O2编译命令使程序运行,尽管是错误的。 “随机”功能不再是随机的;它总是返回 1。例如,使用以下“主要”代码进行测试...

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;
}

...产生此输出:<0, 1000>

最佳答案

看来这是nuwen发行版的问题。 16.0 和 16.1 版本都在 std::random_device 构造函数上或在值生成期间生成某种未定义行为,有时会导致静默崩溃,但很难创建一个简约的示例。

当使用大于 0 的优化级别编译代码时,崩溃似乎消失了。 我不会依赖它,因为 UB 很可能仍然存在于某处,并且程序可能会在最意想不到的地方崩溃。

版本 16.0 使用 GCC 8.1.0,16.1 使用 GCC 8.2.0。 我无法使用从 https://sourceforge.net/projects/mingw-w64/ 下载的 MinGW 重现此错误, 也使用 8.1.0 版本。

此外,请注意 MinGW 上的 std::random_device 不会提供随机数——它将是确定性的,始终给出相同的值。不幸的是,标准允许这样做,我认为这是一个大问题。

如果每次运行只需要不同的值,请考虑使用其他非随机源进行播种,例如来自 C 库的时间。如果你真的需要不确定的值,你可以使用 boost::random::random_device (与 std::random_device 相同的接口(interface)),与 nuwen 发行版一起提供。它不是只有标题,所以你需要添加额外的链接:

g++ foo.cpp -lboost_random -lboost_system

关于c++ - 使用 MinGW gcc/g++ (nuwen distro) 编译的程序中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042937/

相关文章:

c++ - 从文件中读取 2 个字符串

windows - nasm win32 编程 "undefined reference to..."

c++ - 在不知道模板数据类型的情况下如何定义静态模板变量?

在 C 中创建没有依赖项的 Gotoxy() 函数

c++ - Windows DLL 中的字符串表在哪里?

c - C 中结构之间的额外填充

c++ - Debug exec 工作正常但正常的一个段错误

C++ 性能 : use getter in loop or save it to a variable first

c++ - 查找窗口并更改其名称

c++ - 我的机器上 OpenCV 算法的 GPU 版本比 CPU 版本慢?