Dur*_*3nT 1 c++ random segmentation-fault c++11
我有一个包含多个类的程序,其中一些需要随机双精度和整数。在其中一个类中,我定义了一个结构来为随机引擎提供种子,并且能够在需要时通过该结构的对象生成随机实数和整数。带有类和结构声明的 .hpp 文件如下所示:
struct RNG {
public:
static std::mt19937 gen;
static std::uniform_int_distribution<uint32_t> dist_ui;
static std::uniform_real_distribution<double> dist_d;
uint32_t r_ui = dist_ui(gen);
double r_d = dist_d(gen);
private:
static unsigned seed;
};
class A {
private:
uint32_t a_;
public:
A();
};
Run Code Online (Sandbox Code Playgroud)
.cpp 文件如下所示:
#include "A.hpp"
unsigned RNG::seed = 42;
std::mt19937 RNG::gen(RNG::seed);
std::uniform_int_distribution<uint32_t> RNG::dist_ui(1, std::numeric_limits<uint32_t>::max());
std::uniform_real_distribution<double> RNG::dist_d(0.0,1.0);
A::A() {
RNG* r;
a_ = r->dist_ui(r->gen);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我调用uniform_real_distribution
r->dist_d(r->gen)
Run Code Online (Sandbox Code Playgroud)
一切正常。但是,如果我调用uniform_int_distribution
r->dist_ui(r->gen)
Run Code Online (Sandbox Code Playgroud)
与上面的代码片段一样,我遇到了分段错误。如果我仅使用 int dist 而不是 real 和 int 来定义结构,或者将 int dist 的边界更改为 [0,100) 或其他任何内容,也会发生错误。有谁知道这里发生了什么?我感谢任何帮助!
编辑:如果我像这样访问非静态成员,我会得到同样的错误
RNG r;
a_ = r.r_ui;
Run Code Online (Sandbox Code Playgroud)
我在这里有个猜测。类型的对象A也是静态/全局的吗?如果是这样,也许您的问题是因为未定义静态初始化的顺序。因此,您在 dist_ui 初始化之前访问它。
A如果不是这种情况,请发布其余的代码(创建 的实例的代码)。