new[] 如果元素默认构造函数可以抛出

new[] if element default constructor can throw?

本文关键字:构造函数 默认 如果 元素 new      更新时间:2023-10-16

请考虑以下代码:

example_t* a = new example_t[8];

example_t 具有可以抛出的默认 ctor,假设在数组抛出中构造第 5 个元素。是否有自动调用前 4 个元素的析构函数?这是一个定义明确的行为吗?

这是完全定义和行为良好的。如果对象的初始化以异常终止,则所有完全构造的子对象都将销毁,顺序与其构造顺序相反。对于数组和用户定义类型的对象(想想类和类成员),这是相同的。

正式地,我们有 C++11 15.2/2:

任何存储持续时间的对象,其初始化或销毁因异常而终止,将 为其所有完全构造的子对象执行析构函数(不包括 类联合类),即对于主体构造函数 (12.6.2) 已完成执行的子对象 并且析构函数尚未开始执行。

根据 § 5.3.4/8:

新表达式通过调用 分配函数(3.7.4.1)。如果新表达式的结尾为 引发异常,它可能会通过调用 释放函数 (3.7.4.2)。如果分配的类型是非数组 类型,分配函数的名称为运算符 new,并且 释放函数的名称是运算符删除。如果分配的类型 是一种数组类型,分配函数的名称是运算符 new[] 和 释放函数的名称是运算符 delete[]。

它们将被删除,因为释放函数将调用析构函数。

 


我知道依靠编译器的输出是不可信的,但这至少是一个很好的观察: 实时测试