为什么有一个delete[]
?据我了解,它对数组的行为不同。然而,它为什么真的存在呢?C中只有free,没有free_array。delete var
同样在语法上,和之间的唯一区别delete []var
是[]
没有参数(我没有告诉数组的长度)。
那么为什么delete[]
真的存在呢?我知道有人会说你可以超载delete
并且delete[]
(至少我认为这是可能的)但是可以说我们没有超载它。它为什么存在?
为什么有一个delete[]
?据我了解,它对数组的行为不同。然而,它为什么真的存在呢?C中只有free,没有free_array。delete var
同样在语法上,和之间的唯一区别delete []var
是[]
没有参数(我没有告诉数组的长度)。
那么为什么delete[]
真的存在呢?我知道有人会说你可以超载delete
并且delete[]
(至少我认为这是可能的)但是可以说我们没有超载它。它为什么存在?
通常,对于非 POD 类,delete[]
表达式必须在编译时无法确定的可变数量的类实例上调用析构函数。编译器通常必须实现一些运行时“魔术”,可用于确定要销毁的对象的正确数量。
delete
表达式不必担心这一点,它只需销毁提供的指针指向的一个对象。正因为如此,它可以有一个更有效的实现。
通过拆分delete
and delete[]
,delete
可以在没有正确实现所需的开销的情况下实现delete[]
。
如果你删除一个数组,只会调用第一个对象的析构函数。delete[]调用数组中所有对象的析构函数并释放数组的内存。
假设 delete[] 不存在,编写删除数组的代码与仅删除数组中的第一个元素。
delete array; // Deletes first element, oops
delete &array; // Deletes first element, oops
delete &array[0]; // Deletes first element
指向数组的指针作为指向数组第一个元素的指针的别名当然是旧的 C“特性”。
考虑:
int* a = new int[25];
int* b = a;
delete b; // only deletes the first element
C++ 编译器不知道 b 是指向数组还是单个元素。调用delete
数组只会删除第一个元素。