当使用'new'创建数组并使用'delete'运算符删除数组时,delete知道数组的大小。如其他SO线程中所述,此大小信息存储在元数据中。
我的问题:元数据中究竟存储了什么以及需要多少空间?它只是存储在元数据中的大小吗?
答案 0 :(得分:8)
根据C ++标准5.3.4 / 12:
new T[5] results in a call of operator new[](sizeof(T)*5+x),
< ...>其中x是表示数组分配开销的非负未指定值。 < ...>数量 开销可能因新的一次调用而异。
答案 1 :(得分:4)
它是实现定义的。我想说长度至少有四个字节,但也可能有相邻块的“下一个”和“前一个”指针。还可能有一个“魔术”数字,运行时使用它来确保你没有意外地覆盖它们的内存部分等等。
但你不应该担心这一点。实际上,对于像int[10]
这样的小数组(40字节),您可能会发现填充实际占用的空间最大(例如,可能会添加24个字节的填充以使分配32的倍数 - 这可以出于性能原因,比如说。
尽管如此,正如我所说,完全由实施决定他们如何做到这一点。
答案 2 :(得分:0)
这类问题非常适合编译和plataform。每个编译器都以不同的方式实现它。标准说应该实现什么,而不是如何实现它。
当然,此元数据必须包含数组大小或允许我们推断它的其他一些信息。否则,我们将无法为数组中的所有对象调用析构函数。
答案 3 :(得分:0)
这将取决于您的标准库。甚至malloc()也需要数据才能知道分配了多少字节。举个例子,看一下glibc malloc:
http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=malloc/malloc.c;hb=HEAD
每个已分配块的最小开销:4或8个字节
Each malloced chunk has a hidden word of overhead holding size and status information.