std::uniform_int_distribution的分段错误



我有一个包含多个类的程序,其中一些类需要随机双精度和int。在其中一个类中,我定义了一个结构来为随机引擎播种,并能够在需要时通过该结构的对象生成随机实数和整数。带有类和结构声明的.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();
};

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

现在,如果我用调用uniform_real_distribution

r->dist_d(r->gen)

一切都很好。但是,如果我用调用uniform_int_distribution

r->dist_ui(r->gen)

在上面的片段中,我得到了一个分段错误。如果我只使用int dist而不是real和int来定义结构,或者如果我将int dist的边界更改为[0100(或其他什么,也会发生错误。有人知道这里发生了什么吗?我感谢任何帮助!

编辑:如果我访问像这个这样的非静态成员,我会得到同样的错误

RNG r;
a_ = r.r_ui;

我有一个猜测。类型为A的对象是否也是静态/全局的?如果是这样,那么您的问题可能是因为没有定义静态初始化的顺序。因此,您在初始化dist_ui之前就访问了它。

如果不是这样的话,请发布其余的代码(创建A实例的代码(。

一个最小的可复制示例运行良好,最后,我通过仔细地重新构建程序解决了问题。这样做,我发现std::vector访问错误,这可能是执行失败的原因之一。长话短说:我把代码搞砸了,在发布这个问题之前没有仔细查看。然而,正如评论中所指出的,我不应该像下面的代码片段(RNG* r(中那样访问未初始化的指针,即使它们是静态的。相反,使用范围解析操作符(:(

a_ = RNG::dist_ui(RNG::gen)

相关内容

  • 没有找到相关文章

最新更新