在将 C 样式结构重构为 C++ 时,我在创建没有 {} 的结构的新对象时遇到了崩溃。
我已经用以下代码片段说明了这个问题。
struct A {
A() = default;
int* a1;
int* a2;
};
int main()
{
A a{};
std::cout << a.a1 << std::endl; //print 0000000000000000(nullptr)
A b;
std::cout << b.a1 << std::endl; //crash (0xcccccccccccccccc)
}
Run Code Online (Sandbox Code Playgroud)
为什么 a.a1 被初始化为 nullptr 而 b.a1 不是 nullptr?
两个构造的对象有什么不同?
我知道一个解决方案可能是:
struct A {
A() = default;
int* a1 = nullptr;
int* a2 = nullptr;
};
Run Code Online (Sandbox Code Playgroud)
谢谢,
如果使用{},则类中的所有内容都是值初始化的。因此,指针变为空指针,整数变为 0,布尔值变为假,等等。如果不这样做,则字段默认初始化为不确定值。以任何方式使用这些值都会导致未定义的行为。
如果您希望无论如何都确定性地初始化所有内容,这是一种方法:
struct A {
int* a1 = nullptr;
int* a2 = nullptr;
};
Run Code Online (Sandbox Code Playgroud)
在这里,您未明确初始化的任何内容都会为您初始化。但是这个类不再是平凡可构建的。
在cppreference 中阅读有关初始化的更多信息。
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |