C++中new int与new int()的内存初始化规则疑问
C++中
new int与new int()的初始化规则解析 核心差异结论
new int:执行默认初始化,对于int这种内置算术类型,不会初始化内存,结果是未定义的随机值。new int():执行值初始化,对于int类型会被零初始化,结果是0。
针对你的疑问逐一解答
疑问1:new int()属于哪种初始化场景?空括号算参数列表吗?
new int()不属于无初始化器场景,也不是常规的带非空参数列表的直接初始化。它是C++标准中专门定义的值初始化触发形式——当使用new T()(空括号)创建非数组类型对象时,会触发值初始化,而非直接初始化。
这里的空括号并不是传递了空参数列表,而是一种语法标记,用来指定执行值初始化而非默认初始化。
疑问2:既然直接初始化要求非空参数列表,为什么new int()会初始化为0?
你混淆了直接初始化和值初始化的规则:
- 默认初始化:对于
int这类内置类型,不执行任何初始化操作,内存保留原有垃圾值。 - 值初始化:这是独立于默认、直接初始化的另一种初始化规则。对于算术类型(如
int、float),值初始化会执行零初始化,也就是将内存置为0;对于类类型,如果有默认构造函数则调用它,没有的话会报错。
new int()触发的是值初始化,而非直接初始化,所以不需要非空参数列表,最终会把int初始化为0。
非数组类型的相关规则在哪里?
C++标准中,非数组类型的new表达式规则明确:当new的类型后面跟空括号时,执行值初始化。对应到cppreference的描述,非数组类型的初始化规则里,值初始化的触发条件就包含了new T()这种形式——它不属于无初始化器(那是new T),也不属于带非空参数的直接初始化,而是单独的值初始化场景。
内容的提问来源于stack exchange,提问作者mentalmushroom
相关产品推荐
相关产品推荐

