可能重复:
How does delete[] “know” the size of the operand array?
How does the delete in C++ know how many memory locations to delete
我知道这是一个相当简单的问题,但我不确定这两行之间的区别(如果有的话):
double * a = new double[100];
delete[] a;
delete a;
free ((void*)a);
首先,所有这些调用(每个调用没有其他调用)都以相同的方式工作,并且free sizeof(double)* 100 bytes?
这引出了我的第二个问题,程序如何跟踪分配内存的大小?例如,如果我将a
指针发送到一个函数,然后从我的函数中delete[]
这个指针,我是否也会释放相同数量的内存?
由于
答案 0 :(得分:4)
差异,过于简单,是:
delete[] a;
是对的。所有其他都不正确,并将展示未定义的行为。
现在,实际上,在我每天使用的所有编译器上,delete a;
每次都会做正确的事情。但你仍然不应该这样做。未定义的行为从不正确。
free
调用也可能在现实世界中做正确的事情,但仅仅因为你正在释放的东西没有非默认的析构函数。例如,如果你试图free
某个带有析构函数的类,那肯定是行不通的 - 析构函数永远不会被调用。
这是new
/ delete
和malloc
/ free
之间的一个重大差异(不是唯一的区别) - 前者称为构造函数和析构函数,而后者会分配和处理空间。
在他现在删除的帖子中加入了@Rob所说的内容:
简单的规则是:每个new []只需要一个delete []。 每个新版本只需要一次删除。 malloc需要免费。没有 允许混合搭配。
关于delete[]
如何知道要删除的元素数量的问题,请参阅this response以前的重复问题。
答案 1 :(得分:0)
有人纠正我,如果我错了,但就我的理解而言,当您使用delete
和new
之后使用delete[]
时,使用new Type[]
}。使用free
分配内存时使用malloc
。
答案 2 :(得分:0)
关于双精度数组,所有表单的结果都是相同的 - 所有分配的内存都返回给系统。调用free
与delete
与delete[]
的区别在于:
free
仅释放内存(在调用a
时内存管理器存储了为new
分配的内存大小)delete
在释放内存之前调用已分配对象的析构函数delete[]
在释放内存之前调用数组中每个元素的析构函数如果分配对象的析构函数包含释放其他内存或系统资源(例如在对象生命周期内分配的文件或套接字描述符)的清理代码,则区别很重要。
在C ++中,总是在单个实例上使用delete
而在对象/基元数组上使用delete[]
是一个好习惯,无论析构函数的内容如何。