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

Is this deletion expected to destruct each array object?

本文关键字:数组 对象 删除 是否      更新时间:2023-10-16

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

class Type { /* ... */ };
typedef Type Type_42[1][42];
Type (*x)[42] = new Type_42;

由于我使用了new来创建,所以我使用delete来销毁:

delete x;

是否预期42个对象的每个析构函数都会被调用?

delete[]必须用于数组,delete必须用于非数组。由于x是指向数组的指针,因此必须使用delete[]。引文为[expr.delete]/2。第一个音符使这一点清晰明了。

如果操作数具有类类型,则通过调用上述函数将操作数转换为指针类型转换函数,并且在的剩余部分使用转换后的操作数代替原始操作数本节。在第一种备选方案中(删除对象),delete的操作数的值可能是空指针值,指向由上一个新表达式创建的非数组对象的指针,或指向子对象的指针(1.8)表示这样一个对象的基类(第10条)。如果不是,则行为未定义。在第二可选(删除数组),delete的操作数的值可以是空指针值或指针上一个数组新表达式产生的值如果不是,则行为未定义。[注意:这个意味着删除表达式的语法必须与new分配的对象类型匹配,而不是新表达式的语法--尾注][注意:指向const类型的指针可以是删除表达式没有必要去掉指针表达式前面的常量(5.2.11)用作删除表达式的操作数--尾注]