【问题标题】:In C++ are elements of an array of pointer type by default guaranteed to be initialized to nullptr?在 C++ 中,指针类型数组的元素是否默认保证初始化为 nullptr?
【发布时间】:2020-10-15 09:14:02
【问题描述】:

如果我有这样的代码

class Node {
public:
    Node *subnodes[10];
};
Node x = Node();

在代码运行后是否保证x->subnodes[0] == nullptr

我不是 C++ 专家,我发现 C++ 规范令人生畏。这在实践中可行,但是规范是否保证在这种情况下将 nullptr 放入数组的每个元素中(而不是说,可能是垃圾)?到目前为止,我还没有通过找到权威的规范语言来说服自己,并且在野外我看到很多代码示例似乎不相信这是真的。所以,在一段时间没有想出答案之后,我转向你,stackoverflow。提前致谢。

【问题讨论】:

    标签: c++ arrays initialization value-initialization


    【解决方案1】:

    是的,这是有保证的。

    Node() 构造一个临时对象并执行value initialization。结果,成员数组subnodes 的所有元素都是zero-initialized 作为空指针。 x 是从临时对象复制初始化的,它的成员也得到相同的初始化结果。 (因为copy elision x 可能会直接进行值初始化,反正结果不会改变。)

    如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认构造函数的类),则对象为zero-initialized,然后它是default-initialized,如果它有一个非平凡的默认构造函数;

    零初始化的效果是:

    • 如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。
    • 如果 T 是非联合类类型,所有基类和非静态数据成员都初始化为零,所有填充初始化为 零位。构造函数(如果有)将被忽略。
    • ...
    • 如果 T 是数组类型,则每个元素都初始化为零。
    • ...

    顺便说一句:对于default initializationNode x; 一样,成员数组的元素将被初始化为不确定的值。

    【讨论】:

      【解决方案2】:

      虽然保证将其初始化为 nullptr,但我不建议依赖 c++ 中的默认初始化。有时默认初始化会做一些奇怪的事情,例如,如果你没有初始化一个整数,它会用下一个可用的内存地址初始化它,这是零意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 2013-02-01
        • 2019-09-16
        • 2021-03-25
        • 2016-02-01
        相关资源
        最近更新 更多