作者:平凡特产小店 | 来源:互联网 | 2022-12-07 00:39
我今天正在阅读有关delete
和delete[]
运算符的内容,我可以看到,为了释放分配的内存myChar
,我应该调用delete
并释放内存,因为myCharArray
我应该使用delete[]
.
但是我一直认为它myChar
是一个指向大小为1的数组的指针.那么为什么我们delete
在这种情况下使用它呢?为什么我们需要delete
呢?delete[]
如果myChar
实际上是一个大小为1的数组,我们难道不能在任何地方使用吗?
char* myChar = new char;
char* myCharArray = new char[5];
delete myChar;
delete[] myCharArray;
Toby Speight..
7
一个单一的对象是不尺寸1.尺寸1的阵列,其中创建的阵列new char[1]
,需要记录中分配的对象的数目,以便delete[]
知道多少对象破坏.
可以说,new
可以在内部实现new[1]
(并delete
实现为delete[]
) - 这将是一个正确的实现.但是,具有单独的new
并且new[1]
允许优化不存储单个对象的对象计数(非常常见的情况).
不支付你不使用的东西的C++原则在这里发挥作用.如果我们创建一个对象数组,我们支付存储计数的内存和处理价格,但是如果我们创建一个对象,我们就不会产生开销.
1> Toby Speight..:
一个单一的对象是不尺寸1.尺寸1的阵列,其中创建的阵列new char[1]
,需要记录中分配的对象的数目,以便delete[]
知道多少对象破坏.
可以说,new
可以在内部实现new[1]
(并delete
实现为delete[]
) - 这将是一个正确的实现.但是,具有单独的new
并且new[1]
允许优化不存储单个对象的对象计数(非常常见的情况).
不支付你不使用的东西的C++原则在这里发挥作用.如果我们创建一个对象数组,我们支付存储计数的内存和处理价格,但是如果我们创建一个对象,我们就不会产生开销.
2> Pete Becker..:
你是对的,没有内在的理由来区分new/delete
和new[]/delete[]
; 该语言可以简单地省略非数组版本,或者省略delete
并且需要delete[]
与分配的单个对象一起正常工作new
.但这样做会增加单对象案例实现的复杂性和相应的开销,因为它必须在某处存储大小为1 delete[]
才能做正确的事情.C++的主要设计原则之一是(并且是)您不支付您不使用的内容.new/delete
是这种简约的结果.它将成本从实现转移到程序员.