为什么我们甚至需要delete运算符? (我们不能只使用delete [])

时间:2018-08-22 08:19:56

标签: c++ pointers

我今天在阅读有关deletedelete[]运算符的信息,我可以看到 要释放分配给myChar的内存,我应该调用delete,并释放myCharArray的内存,我应该使用delete[]

但是,我一直认为myChar是指向大小为1的数组的指针。为什么在这种情况下我们使用delete?为什么我们完全需要delete?如果delete[]实际上是大小为1的数组,我们是否就不能在所有地方都使用myChar了?

char* myChar = new char;
char* myCharArray = new char[5];

delete myChar;
delete[] myCharArray;

2 个答案:

答案 0 :(得分:7)

单个对象不是大小为1的数组。大小为1的数组是使用new char[1]创建的,需要记录分配的对象数,因此{{ 1}}知道要销毁多少个对象。

可以说,delete[] 可以在内部实现为new(而new[1]实现为delete)-这是正确的实现。但是,将delete[]new分开可以优化不存储单个对象的对象计数的情况(这是非常常见的情况)。

不使用不使用的东西的C ++原则在这里起作用。如果创建一个对象数组,则要付出存储计数的内存和处理费用,但是如果创建单个对象,则不会产生开销。

答案 1 :(得分:6)

您是对的,new/deletenew[]/delete[]之间没有区别的内在原因;该语言可能只是省略了非数组版本,或者省略了delete并要求delete[]new分配的单个对象一起正常工作。但是,这样做会增加单对象情况的实现的复杂性和相应的开销,因为这样一来,它必须在某处存储大小为1的内容,以便delete[]可以做正确的事情。 C ++的主要设计原则之一是(并且是)您不用为不使用的东西付费。 new/delete是这种简约的结果。它将成本从实现转移到程序员。