我今天在阅读有关delete
和delete[]
运算符的信息,我可以看到
要释放分配给myChar
的内存,我应该调用delete
,并释放myCharArray
的内存,我应该使用delete[]
。
但是,我一直认为myChar
是指向大小为1的数组的指针。为什么在这种情况下我们使用delete
?为什么我们完全需要delete
?如果delete[]
实际上是大小为1的数组,我们是否就不能在所有地方都使用myChar
了?
char* myChar = new char;
char* myCharArray = new char[5];
delete myChar;
delete[] myCharArray;
答案 0 :(得分:7)
单个对象不是大小为1的数组。大小为1的数组是使用new char[1]
创建的,需要记录分配的对象数,因此{{ 1}}知道要销毁多少个对象。
可以说,delete[]
可以在内部实现为new
(而new[1]
实现为delete
)-这是正确的实现。但是,将delete[]
和new
分开可以优化不存储单个对象的对象计数的情况(这是非常常见的情况)。
不使用不使用的东西的C ++原则在这里起作用。如果创建一个对象数组,则要付出存储计数的内存和处理费用,但是如果创建单个对象,则不会产生开销。
答案 1 :(得分:6)
您是对的,new/delete
和new[]/delete[]
之间没有区别的内在原因;该语言可能只是省略了非数组版本,或者省略了delete
并要求delete[]
与new
分配的单个对象一起正常工作。但是,这样做会增加单对象情况的实现的复杂性和相应的开销,因为这样一来,它必须在某处存储大小为1的内容,以便delete[]
可以做正确的事情。 C ++的主要设计原则之一是(并且是)您不用为不使用的东西付费。 new/delete
是这种简约的结果。它将成本从实现转移到程序员。