在没有 {} 的情况下初始化时,C++ 指针结构崩溃

Mou*_*dan 0 c++ c++14

在将 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)

谢谢,

Ayx*_*xan 5

如果使用{},则类中的所有内容都是值初始化的。因此,指针变为空指针,整数变为 0,布尔值变为假,等等。如果不这样做,则字段默认初始化为不确定值。以任何方式使用这些值都会导致未定义的行为。


如果您希望无论如何都确定性地初始化所有内容,这是一种方法:

struct A {
    int* a1 = nullptr;
    int* a2 = nullptr;
};
Run Code Online (Sandbox Code Playgroud)

在这里,您未明确初始化的任何内容都会为您初始化。但是这个类不再是平凡可构建的

cppreference 中阅读有关初始化的更多信息。