为什么C ++中有delete []?

时间:2010-09-12 09:26:25

标签: c++ delete-operator

为什么会有delete[]?从我的理解,它对阵列的行为不同。但是,它为什么真的存在? C中只有免费,没有free_array。同样在语法中,delete vardelete []var之间的唯一区别是没有参数的[](我没有告诉数组的长度)。

为什么delete[]真的存在?我知道有人会说你可以重载deletedelete[](至少我认为这是可能的),但我们可以说我们不会超载它。它为什么存在?

4 个答案:

答案 0 :(得分:19)

通常,对于非POD类,delete[]表达式必须在可编译的类实例上调用析构函数,这些类实例在编译时无法确定。编译器通常必须实现一些运行时“魔法”,可以用来确定要销毁的正确数量的对象。

delete表达式不必担心这一点,它只需要销毁提供的指针所指向的一个对象。因此,它可以实现更高效的实施。

通过拆分deletedelete[],可以实现delete,而无需正确实施delete[]所需的开销。

答案 1 :(得分:3)

如果删除数组,则只会调用第一个对象的析构函数。 delete [] 调用数组中所有对象的析构函数并释放数组的内存。

答案 2 :(得分:3)

假设delete []不存在,编写删除数组的代码vs只删除数组中的第一个元素。

delete array;        // Deletes first element, oops    
delete &array;       // Deletes first element, oops
delete &array[0];    // Deletes first element

指向数组的指针是指向数组第一个元素的指针的别名,当然是旧的C“特征”。

答案 3 :(得分:1)

考虑:

int* a = new int[25];
int* b = a;

delete b;  // only deletes the first element

C ++编译器不知道b是指向数组还是单个元素。在数组上调用delete只会删除第一个元素。