2012-05-11 51 views
0

可能重复:
How does delete[] “know” the size of the operand array?
How does the delete in C++ know how many memory locations to deletedelete []如何跟踪元素的数量?

我知道这是一个很简单的问题,但我一不知道的差异(如果有的话),这个线之间:

double * a = new double[100]; 
delete[] a; 
delete a; 
free ((void*)a); 

首先,将所有这些电话(每个都没有使用ers)以相同的方式工作并且免费sizeof(double)* 100字节? 这导致我第二个问题,程序如何跟踪分配内存的大小?例如,如果我发送我的a指针到一个函数,然后delete[]这个指针从我的函数中,我是否也会释放相同数量的内存?

感谢

回答

4

的差异,过于简单化,是这样的:

delete[] a; 

是正确的。所有其他人都不正确,并会显示未定义的行为。

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

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

这就是new/deletemalloc/free之间的差异很大(不是唯一的区别)一个 - 前调用构造函数和析构函数,而后者meerly分配和dealocate空间。

结合东西@Rob他现在删除的帖子说:

简单的规则是这样的:每一个新的[]只需要一个删除[]。 每个新需要一个删除。 malloc需要免费。不允许混合搭配 。

至于delete[]如何知道有多少元素删除的问题,请参见this response到以前的重复问题。

+0

但是这并没有回答的问题是如何'删除[]'跟踪元素的数量。 –

+0

@NathanFellman:是的,但我认为这是在充分[链接复制](解决http://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-数组)。这里真的有两个问题 - 我回答了一个,而另一个回答了另一个问题。 –

+0

@NathanFellman:编辑。 –

0

有人纠正我,如果我错了,但据我了解,你使用delete当先前使用new Type[]newdelete[]分配的内存。当您使用malloc分配内存时使用free

请参阅关于deletefree的C++参考。

0

关于双打的阵列,所有形式的结果是相同的 - 所有的已分配的内存被返回给系统。在调用freedeletedelete[]的区别是:

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

所不同的是重要的,如果所分配的对象的析构函数包含其释放其它存储器或系统资源,如一个对象的生命周期期间分配的文件或套接字描述符清除代码。

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