存储在某处的动态分配数组的大小

Is the size of a dynamically-allocated array stored somewhere?

本文关键字:数组 动态分配 在某处 存储      更新时间:2023-10-16

在我看来,delete[]知道动态分配数组的大小。我的问题是:有没有办法把它拿出来,这样我们就不需要在编码时明确提供大小。

delete[] 用来确定它必须处理多少项的方法依赖于实现。你不能以任何方式接近它或使用它。

阅读C++常见问题 [16.14] 在 p = new Fred[n] 之后,编译器如何知道在 delete[] p 期间有 n 个对象要销毁?(以及整个部分关于免费商店管理的一般概念。

我的问题是:有没有办法把它拿出来,这样我们就不需要在编码时明确提供大小。

不需要,你只需称呼delete [],没有大小。

编译器存储大小的方式是实现细节,未指定。大多数人在阵列启动之前(而不是在其他人提到的之后)将其存储在一些内存中。

看到这个相关的问题:delete[] 如何"知道"操作数数组的大小?

已编辑:

由于 delete [] 需要为数组的所有元素调用析构函数,因此长度必须存储在某个地方。至于为什么无法访问此内存以防止错误,例如由于其未知大小而离开阵列 - 我不太确定。严格来说,静态分配数组的长度必须在编译时知道,动态分配数组的长度必须由运行时存储,因此在这两种情况下,缓冲区溢出错误理论上都是 100% 可以预防的,但静态和动态数组都是不安全的。我的猜测是,这是出于性能目的,边界检查会使其变慢,原始(C 样式)数组在零安全性下提供最佳性能。

此实现因编译器和运行时供应商而异,可能有一些实现可能是可访问和可用的,但它不会被视为标准和推荐的做法。要存储的长度的逻辑位置是在分配的内存片段的标头中的某个位置,在您将获得数组的第一个元素的实际地址之前。

C++编译器

的大小是动态分配的数组,深埋在某处;但是,在C++编码时无法以任何方式访问它 - 因此您必须在分配后将大小存储在某个地方。

[编辑]:虽然某些版本的Visual Studio编译器套件将大小存储在索引-1处,但这在编译器之间是不可信的,或者在编码时根本不使用。

我认为它依赖于编译器,您无法获取它以供应用程序使用。以下链接显示了编译器使用的 2 种方法。

http://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-38.7

http://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-38.8

编译器遵循不同的方法来存储分配给new的内存。这是我在某处读到的方法之一。

当编译器根据new调用分配内存时,它会设置一个额外的字节,也许在开始时,它将在其中存储分配的内存量。因此,当它遇到delete调用时,它将使用此存储值来决定必须取消分配多少内存。