这个删除是否会破坏每个数组对象?

jxh*_*jxh 2 c++ language-lawyer

假设我使用using的变体new来返回指向数组的指针:

class Type { /* ... */ };

typedef Type Type_42[1][42];
Type (*x)[42] = new Type_42;
Run Code Online (Sandbox Code Playgroud)

因为我new以前创建,我delete用来销毁:

delete x;
Run Code Online (Sandbox Code Playgroud)

是否应该调用42个对象的每个析构函数?

Bri*_*ian 8

delete[]必须用于数组和delete非数组.由于x是指向数组的指针,因此必须使用delete[].引用是[expr.delete]/2.第一个注释使这个结晶清晰.

如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并使用转换后的操作数代替本节其余部分的原始操作数.在第一个替代(删除对象)中,操作数的值delete可以是空指针值,指向由前一个新表达式创建的非数组对象的指针,或指向表示基础的子对象(1.8)的指针这类对象的类别(第10条).如果不是,则行为未定义.在第二个备选(删除数组)中,操作数的值delete可以是空指针值或由前一个数组new-expression产生的指针值.如果不是,则行为未定义.[ 注意:这意味着delete-expression的语法必须与分配的对象的类型匹配new,而不是new-expression的语法.- 结束注释 ] [ 注意:指向const类型的指针可以是delete-expression的操作数 ; 在将指针表达式用作delete-expression的操作数之前,不必丢弃指针表达式的constness(5.2.11).- 结束说明 ]