delete []如何跟踪元素的数量?

时间:2012-05-11 19:47:16

标签: c++ memory-management

  

可能重复:
  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[]这个指针,我是否也会释放相同数量的内存?

由于

3 个答案:

答案 0 :(得分:4)

差异,过于简单,是:

delete[] a;

是对的。所有其他都不正确,并将展示未定义的行为。

现在,实际上,在我每天使用的所有编译器上,delete a;每次都会做正确的事情。但你仍然不应该这样做。未定义的行为从不正确。

free调用也可能在现实世界中做正确的事情,但仅仅因为你正在释放的东西没有非默认的析构函数。例如,如果你试图free某个带有析构函数的类,那肯定是行不通的 - 析构函数永远不会被调用。

这是new / deletemalloc / free之间的一个重大差异(不是唯一的区别) - 前者称为构造函数和析构函数,而后者会分配和处理空间。

在他现在删除的帖子中加入了@Rob所说的内容:

  

简单的规则是:每个new []只需要一个delete []。   每个新版本只需要一次删除。 malloc需要免费。没有   允许混合搭配。

关于delete[]如何知道要删除的元素数量的问题,请参阅this response以前的重复问题。

答案 1 :(得分:0)

有人纠正我,如果我错了,但就我的理解而言,当您使用deletenew之后使用delete[]时,使用new Type[] }。使用free分配内存时使用malloc

请参阅deletefree上的c ++参考。

答案 2 :(得分:0)

关于双精度数组,所有表单的结果都是相同的 - 所有分配的内存都返回给系统。调用freedeletedelete[]的区别在于:

  • free仅释放内存(在调用a时内存管理器存储了为new分配的内存大小)
  • delete在释放内存之前调用已分配对象的析构函数
  • delete[]在释放内存之前调用数组中每个元素的析构函数

如果分配对象的析构函数包含释放其他内存或系统资源(例如在对象生命周期内分配的文件或套接字描述符)的清理代码,则区别很重要。

在C ++中,总是在单个实例上使用delete而在对象/基元数组上使用delete[]是一个好习惯,无论析构函数的内容如何。