0

可能重复:
delete[] 如何“知道”操作数数组的大小?
C++中的delete怎么知道要删除多少内存位置

我知道这是一个相当简单的问题,但我不确定这行之间的区别(如果有的话):

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

首先,所有这些调用(在没有其他调用的情况下使用每个调用)是否以相同的方式工作并释放 sizeof(double)*100 字节?这让我想到了第二个问题,程序如何跟踪分配内存的大小?例如,如果我将a指针发送到一个函数,那么delete[]我的函数中的这个指针,我是否也会释放相同数量的内存?

谢谢

4

3 回答 3

4

过于简单化的区别在于:

delete[] a;

是正确的。所有其他都是不正确的,并且会表现出未定义的行为。

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

free调用也可能在现实世界中做正确的事情,但这只是因为您要释放的东西没有非默认析构函数。例如,如果您尝试free使用带有析构函数的类,它肯定不会工作——析构函数永远不会被调用。

new这是/deletemalloc/之间最大的区别之一(不是唯一的区别)free——前者调用构造函数和析构函数,而后者只是分配和释放空间。

合并@Rob 在他现已删除的帖子中所说的内容:

简单的规则是:每个 new[] 都需要一个 delete[]。每一个新的都需要一个删除。malloc 需要免费的。不允许混搭。

至于如何delete[]知道要删除多少个元素的问题,请参阅上一个重复问题的回复。

于 2012-05-11T19:51:52.200 回答
0

关于双精度数组,所有形式的结果都是一样的——所有分配的内存都返回给系统。call freevs. deletevs.的区别delete[]在于:

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

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

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

于 2012-05-11T20:03:25.877 回答
0

有人纠正我,如果我错了,但据我了解,您在delete之前使用. 并且在您使用. newdelete[]new Type[]freemalloc

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

于 2012-05-11T19:56:49.330 回答