【问题标题】:Creating built-in types with the new expression使用新表达式创建内置类型
【发布时间】:2015-07-01 15:16:55
【问题描述】:

让我们考虑以下简单的程序:

int main()
{
    int *a = new int;
}

*a 的值为0 是否可靠。我不确定,因为原语没有默认初始化:

默认初始化 T 类型的对象意味着:

(7.1) — 如果 T 是(可能是 cv 限定的)类类型(第 9 条), 构造函数被考虑。适用的构造函数是 枚举(13.3.1.3),初始化器()的最佳选择是 通过重载决议(13.3)选择。构造函数因此 使用空参数列表调用 selected 来初始化 对象。

(7.2) — 如果 T 是数组类型,则每个元素都是默认初始化的。

(7.3) — 否则,不执行初始化

我想说*a 没有初始化,所以访问它会导致UB。对吗?

【问题讨论】:

    标签: c++ initialization


    【解决方案1】:

    为了绝对清楚,请考虑

    int *a = new int;
    
    int *b = new int();
    

    *a 未初始化*b 已初始化为 0。

    在初始化之前使用*a 是未定义的行为。

    【讨论】:

    • 啊,没注意到你的回答。你能不能补充一点说明。我就是不明白为什么 new int 和 new int() 不一样?
    • 简单来说就是语言规则。将int() 视为调用默认参数设置为 0 的构造函数。类似地,new int(5) 创建一个值为 5 的整数并返回一个指向它的指针。
    【解决方案2】:

    是的。

    您可以使用new int() 对其进行值初始化(即将int 设置为零)。

    【讨论】:

    • 那么,问为什么是合理的?为什么可靠? new int 导致执行默认初始化....
    • @St.Antario 正如您从标准中引用的那样,内置类型的默认初始化是无操作的,这意味着您检索放置在那里的任何旧垃圾值(UB用标准语言)
    • @Quentin 知道了,但为什么new int() 有不同的行为?我不明白...
    • @St.Antario 我不能给你比“因为标准这么说”更好的答案。 Here 是可能的初始化类型的完整列表。注意:有很多:)
    • @Quentin 确实,找到了。 初始化器为空括号集的对象,即 (),应进行值初始化。 值初始化意味着对内置类型进行零初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多