为什么会有delete[]
?从我的理解,它对阵列的行为不同。但是,它为什么真的存在? C中只有免费,没有free_array。同样在语法中,delete var
和delete []var
之间的唯一区别是没有参数的[]
(我没有告诉数组的长度)。
为什么delete[]
真的存在?我知道有人会说你可以重载delete
和delete[]
(至少我认为这是可能的),但我们可以说我们不会超载它。它为什么存在?
答案 0 :(得分:19)
通常,对于非POD类,delete[]
表达式必须在可编译的类实例上调用析构函数,这些类实例在编译时无法确定。编译器通常必须实现一些运行时“魔法”,可以用来确定要销毁的正确数量的对象。
delete
表达式不必担心这一点,它只需要销毁提供的指针所指向的一个对象。因此,它可以实现更高效的实施。
通过拆分delete
和delete[]
,可以实现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
只会删除第一个元素。