删除[]如何跟踪元素的数量
How does delete[] keep track of the number of elements?
可能的重复项:
delete[] 如何"知道"操作数数组的大小?
C++ 中的删除如何知道要删除的内存位置数
我知道这是一个相当简单的问题,但我不确定这些行之间的区别(如果有的话(:
double * a = new double[100];
delete[] a;
delete a;
free ((void*)a);
首先,所有这些调用(在没有其他调用的情况下使用(是否以相同的方式工作并释放大小(双(*100 字节?这让我想到了第二个问题,程序如何跟踪分配内存的大小?例如,如果我将a
指针发送到一个函数,然后从我的函数中delete[]
这个指针,我是否也会释放相同数量的内存?
谢谢
过度简化的区别是:
delete[] a;
是正确的。 所有其他行为都是不正确的,并且将显示未定义的行为。
现在,实际上,在我每天使用的所有编译器上,delete a;
每次都会做正确的事情。 但是你仍然不应该这样做。 未定义的行为永远不会正确。
free
调用也可能在现实世界中执行正确的操作,但这只是因为您要释放的内容没有非默认析构函数。 例如,如果你试图free
一个带有析构函数的类,它肯定行不通——析构函数永远不会被调用。
这是new
/delete
和malloc
/free
之间的最大区别之一(不是唯一的区别(——前者调用构造函数和析构函数,而后者则简单地分配和取消分配空间。
结合@Rob在他现已删除的帖子中所说的话:
简单的规则是这样的:每个新的[]只需要一个删除[]。 每个新内容只需要删除一次。马洛克需要免费。不 允许混搭。
至于delete[]
如何知道要删除多少元素的问题,请参阅对先前重复问题的答复。
错了,有人纠正我,但据我了解,您在之前分配内存时使用delete
new
并在使用 new Type[]
后delete[]
.当您使用 malloc
分配内存时,将使用free
。
请参阅有关删除和释放的 C++ 参考。
关于双精度数组,所有形式的结果都是相同的 - 所有分配的内存都返回到系统。呼叫free
与呼叫的区别 delete
vs. delete[]
是:
-
free
仅释放内存(为a
内存管理器分配的内存大小在调用new
时由内存管理器存储
( -
delete
释放内存之前调用已分配对象的析构函数 -
delete[]
释放内存之前调用数组中每个元素的析构函数
如果已分配对象的析构函数包含清理代码,该代码释放在对象生存期内分配的其他内存或系统资源(如文件或套接字描述符(,则差异很重要。
C++,无论析构函数的内容如何,在单个实例上使用delete
,在对象/原语数组上使用delete[]
,这是一个很好的习惯。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 我能做些什么来跟踪矢量元素?
- 删除[]如何跟踪元素的数量
- 使用std::remove_if跟踪已删除的元素
- 标准::多集,跟踪插入的元素位置
- 如何跟踪指向STL列表元素的指针
- 快速数组比较和替换最接近值的元素的算法.(跟踪点)