9

为什么有一个delete[]?据我了解,它对数组的行为不同。然而,它为什么真的存在呢?C中只有free,没有free_array。delete var同样在语法上,和之间的唯一区别delete []var[]没有参数(我没有告诉数组的长度)。

那么为什么delete[]真的存在呢?我知道有人会说你可以超载delete并且delete[](至少我认为这是可能的)但是可以说我们没有超载它。它为什么存在?

4

4 回答 4

19

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

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

通过拆分deleteand delete[]delete可以在没有正确实现所需的开销的情况下实现delete[]

于 2010-09-12T09:33:37.623 回答
3

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

于 2010-09-12T09:33:31.010 回答
3

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

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

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

于 2010-09-12T09:37:20.427 回答
1

考虑:

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

delete b;  // only deletes the first element

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

于 2010-09-12T09:53:10.310 回答