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

Koh*_*001 18 c++

考虑以下代码:

example_t* a = new example_t[8];
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 14

这是非常明确和良好的行为.如果对象的初始化以与构造相反的顺序终止,则会破坏所有完全构造的子对象.对于数组而言,这与用户定义类型的对象(想想类和类成员)相同.

形式上,我们有C++ 11 15.2/2:

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


mas*_*oud 9

根据§5.3.4/ 8:

new-expression通过调用分配函数(3.7.4.1)获取对象的存储空间.如果new-expression通过抛出异常终止,它可以通过调用释放函数来释放存储(3.7.4.2).如果分配的类型是非数组类型,则分配函数的名称为operator new,释放函数的名称为operator delete.如果分配的类型是数组类型,则分配函数的名称为operator new [],而释放函数的名称为operator delete [].

它们将被删除,因为deallocation函数将调用析构函数.

 


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

  • 我经常停下来开始"可能"的深层含义,特别是在像*那样的句子中. (11认同)
  • 问题不在于存储,而在于元素析构. (3认同)