使用MinGW gcc/g++(nuwen发行版)编译的程序出现运行时错误
Run-time error in program compiled with MinGW gcc/g++ (nuwen distro)
#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
UPDATE:将-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/,也使用8.1.0版本。
此外,请注意,MinGW上的std::random_device不会提供随机数——它将是确定性的,总是给出相同的值。不幸的是,标准允许这样做,在我看来这是一个大问题。
如果每次运行只需要不同的值,可以考虑使用其他源而不是随机源进行种子设定,比如C库中的时间。如果您确实需要非确定性的值,可以使用nuwen发行版提供的boost::random::random _device(与std::random_device相同的接口)。不过,它不仅仅是标题,所以你需要添加额外的链接:
g++foo.cpp-lbost_random-lbostrongystem
- 如何从测试脚本中运行WAF编译C++程序?
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 在Yocto上本地构建和编译C / C++程序
- 我无法在代码块中编译c ++程序。它给了我错误
- 在 turbo c++ 中使用 TCC 从 cmd 编译C++程序
- 如何在Linux中编译C 程序以生成Windows可执行文件
- 在Python中编译C 程序时,请尝试捕获OS错误
- 在Windows命令提示符中使用G 编译C 程序
- 如何使用HDF5源代码编译c程序
- 如何在Mac终端中编译C ++程序
- 设置 VS 代码以编译C++程序
- 无法在 Ubuntu 上编译 c++ 程序
- 无法使用 libcurl 库编译 c++ 程序
- 编译C 程序,该程序将SFML与MINGW一起到端口,从Linux到Windows
- 编译C 程序时具有逻辑错误,该程序应将任意大的数字表示为字符串
- 如何在 Windows 命令提示符下使用 Dev C++ 编译器编译 c++ 程序
- 在cygwin中使用mingw编译器编译c ++程序时缺少dll。
- 无法在Windows上编写的Linux上编译C程序
- 架构的未定义符号x86_64惠姆使用G 编译C 程序
- 指定netbeans用来编译C++程序的完整编译命令