在 class 内初始化数组会出现 std::bad_alloc 错误,但在外部不会?
Initializing array inside class gives std::bad_alloc error, but outside doesn't?
我有一个程序有两个 classes(我称它们为 Master 和 Slave),Slave 继承自 Master。在 Slave 中,我定义了一个结构,以及这个结构类型的可能值数组。然后用数组的索引实例化从站,我想从主站 class.
填充其值的变量
像这样:
class Master
{
public:
std::string _a;
char _b;
int _c;
int _d;
int _e;
Master(std::string a, char b, int c, int d, int e)
: _a {a}, _b {b}, _c {c}, _d {d}, _e {e} {}
};
class Slave : public Master
{
public:
struct SlaveStruct
{
std::string a;
char b;
int c;
int d;
int e;
};
const SlaveStruct slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
Slave(int index) : Master {slaveArray[index].a, slaveArray[index].b,
slaveArray[index].c, slaveArray[index].d, slaveArray[index].e} {}
};
但是,当我尝试实例化它时,会出现 std::bad_alloc 错误。弄乱了,我发现它工作得很好,但是如果我只是在 class 内声明数组并在外部初始化它,就像这样:
class Slave : public Master
{
//(...)
static SlaveStruct slaveArray[3];
//(...)
};
Slave::SlaveStruct Slave::slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
然而,这是为什么呢?这个数组的大小为 144 字节,它应该几乎不会在堆栈中产生任何影响,而且我只实例化 class 一次。尝试调试它,但在进入从属构造函数后,它进入了我无法理解的 C++ 本机函数的深渊,很快就会抛出 bad_alloc 错误。
UPDATE:根据评论中的要求,class 实例化如下:
int main()
{
Slave slave {1}; // For example, any index will throw the same error.
}
平台:Windows10,MSVC 2017。
首先调用基础 class 构造函数,然后构造成员。
在 Master {slaveArray[index].a,...}
中,您试图将 slaveArray[index].a
传递给基础 class' 构造函数,但此时 slaveArray
尚未初始化。因此,您的程序表现出未定义的行为。
相比之下,静态成员在程序启动时初始化,在输入 main
之前。这就是为什么你的第二个例子工作正常。
我有一个程序有两个 classes(我称它们为 Master 和 Slave),Slave 继承自 Master。在 Slave 中,我定义了一个结构,以及这个结构类型的可能值数组。然后用数组的索引实例化从站,我想从主站 class.
填充其值的变量像这样:
class Master
{
public:
std::string _a;
char _b;
int _c;
int _d;
int _e;
Master(std::string a, char b, int c, int d, int e)
: _a {a}, _b {b}, _c {c}, _d {d}, _e {e} {}
};
class Slave : public Master
{
public:
struct SlaveStruct
{
std::string a;
char b;
int c;
int d;
int e;
};
const SlaveStruct slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
Slave(int index) : Master {slaveArray[index].a, slaveArray[index].b,
slaveArray[index].c, slaveArray[index].d, slaveArray[index].e} {}
};
但是,当我尝试实例化它时,会出现 std::bad_alloc 错误。弄乱了,我发现它工作得很好,但是如果我只是在 class 内声明数组并在外部初始化它,就像这样:
class Slave : public Master
{
//(...)
static SlaveStruct slaveArray[3];
//(...)
};
Slave::SlaveStruct Slave::slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
然而,这是为什么呢?这个数组的大小为 144 字节,它应该几乎不会在堆栈中产生任何影响,而且我只实例化 class 一次。尝试调试它,但在进入从属构造函数后,它进入了我无法理解的 C++ 本机函数的深渊,很快就会抛出 bad_alloc 错误。
UPDATE:根据评论中的要求,class 实例化如下:
int main()
{
Slave slave {1}; // For example, any index will throw the same error.
}
平台:Windows10,MSVC 2017。
首先调用基础 class 构造函数,然后构造成员。
在 Master {slaveArray[index].a,...}
中,您试图将 slaveArray[index].a
传递给基础 class' 构造函数,但此时 slaveArray
尚未初始化。因此,您的程序表现出未定义的行为。
相比之下,静态成员在程序启动时初始化,在输入 main
之前。这就是为什么你的第二个例子工作正常。