删除[]如何跟踪元素的数量

How does delete[] keep track of the number of elements?

本文关键字:元素 跟踪 何跟踪 删除      更新时间:2023-10-16

可能的重复项:
delete[] 如何"知道"操作数数组的大小?
C++ 中的删除如何知道要删除的内存位置数

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

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

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

谢谢

过度简化的区别是:

delete[] a;

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

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

free调用也可能在现实世界中执行正确的操作,但这只是因为您要释放的内容没有非默认析构函数。 例如,如果你试图free一个带有析构函数的类,它肯定行不通——析构函数永远不会被调用。

这是new/deletemalloc/free之间的最大区别之一(不是唯一的区别(——前者调用构造函数和析构函数,而后者则简单地分配和取消分配空间。

结合@Rob在他现已删除的帖子中所说的话:

简单的规则是这样的:每个新的[]只需要一个删除[]。 每个新内容只需要删除一次。马洛克需要免费。不 允许混搭。

至于delete[]如何知道要删除多少元素的问题,请参阅对先前重复问题的答复。

如果我

错了,有人纠正我,但据我了解,您在之前分配内存时使用delete new 并在使用 new Type[]delete[].当您使用 malloc 分配内存时,将使用free

请参阅有关删除和释放的 C++ 参考。

关于双精度数组,所有形式的结果都是相同的 - 所有分配的内存都返回到系统。呼叫free与呼叫的区别 delete vs. delete[]是:

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

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

C++,无论析构函数的内容如何,在单个实例上使用delete,在对象/原语数组上使用delete[],这是一个很好的习惯。