在<random>构造函数中初始化类会导致段错误
Initializing <random> classes in constructor causes segfault
在下面的代码中,RandomCharSource
应该根据请求简单地返回一个随机字符。它的构造函数初始化了mt19937
、uniform_int_distribution<int>
和random_device
。然而,当我实例化我的对象时,我得到了一个段错误。
当我在下面的bar()
函数中手动创建这些随机类时,它工作得很好。
我做错了什么?这里有初始化顺序问题吗?我使用的是GCC 4.7.3。
#include <random>
#include <iostream>
class RandomCharSource
{
public:
explicit RandomCharSource() : _re{_rd()}, _dist{0, 255} {};
inline char get_next_char() { return _dist(_re); };
private:
std::mt19937 _re;
std::uniform_int_distribution<int> _dist;
std::random_device _rd;
};
void foo()
{
RandomCharSource s;
std::cout << s.get_next_char() << std::endl;
}
void bar()
{
std::random_device _rd;
std::mt19937 _re{_rd()};
std::uniform_int_distribution<int> _dist{0,255};
std::cout << (char)_dist(_re) << std::endl;
}
int main()
{
bar(); // Works OK
foo(); // Segfault
return 0;
}
这是因为你的初始化顺序
class RandomCharSource
{
public:
explicit RandomCharSource() : _re{_rd()}, _dist{0, 255} {};
inline char get_next_char() { return _dist(_re); };
private:
std::mt19937 _re;
std::uniform_int_distribution<int> _dist;
std::random_device _rd;
};
你需要在_re
之前有_rd
。成员按照在类中声明的顺序初始化。所以当你尝试用_rd
初始化_re
时,_rd
还没有初始化。
来自标准§12.6.2.13
(强调我的)
在非委托构造函数中,初始化按照以下顺序进行:
13.1 -首先,并且仅对于最派生类的构造函数(1.8),虚基类按照它们在基类的有向无环图的深度优先的从左到右遍历中出现的顺序进行初始化,其中"从左到右"是基类在派生类基指定符列表中出现的顺序。
13.2 -然后,直接基类按照它们出现在基类说明符列表中的声明顺序进行初始化(与初始化器的顺序无关)。
13.3 -然后,非静态数据成员按照它们在类定义中声明的顺序初始化(同样与mems初始化器的顺序无关)。
13.4 -最后执行构造函数体的复合语句。
[注:声明顺序是强制的,以确保基和成员子对象在初始化的反向顺序。端注)
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误