存储在某处的动态分配数组的大小
Is the size of a dynamically-allocated array stored somewhere?
在我看来,delete[]
知道动态分配数组的大小。我的问题是:有没有办法把它拿出来,这样我们就不需要在编码时明确提供大小。
delete[] 用来确定它必须处理多少项的方法依赖于实现。你不能以任何方式接近它或使用它。
阅读C++常见问题 [16.14] 在 p = new Fred[n] 之后,编译器如何知道在 delete[] p 期间有 n 个对象要销毁?(以及整个部分关于免费商店管理的一般概念。
你我的问题是:有没有办法把它拿出来,这样我们就不需要在编码时明确提供大小。
不需要,你只需称呼delete []
,没有大小。
编译器存储大小的方式是实现细节,未指定。大多数人在阵列启动之前(而不是在其他人提到的之后)将其存储在一些内存中。
看到这个相关的问题:delete[] 如何"知道"操作数数组的大小?
已编辑:
由于 delete [] 需要为数组的所有元素调用析构函数,因此长度必须存储在某个地方。至于为什么无法访问此内存以防止错误,例如由于其未知大小而离开阵列 - 我不太确定。严格来说,静态分配数组的长度必须在编译时知道,动态分配数组的长度必须由运行时存储,因此在这两种情况下,缓冲区溢出错误理论上都是 100% 可以预防的,但静态和动态数组都是不安全的。我的猜测是,这是出于性能目的,边界检查会使其变慢,原始(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
调用时,它将使用此存储值来决定必须取消分配多少内存。
- 字符指针数组内存分配
- 当按下 SFML C++时,如何在数组中分配值
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 将数组动态分配到具有指针参数的函数中
- C++ 无法将字符数组变量分配给字符串变量
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 动态数组仅分配一个元素
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- 动态数组内存分配如何工作
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 简单的数组内存分配与大小动态分配和预定的大小
- 分配对象数组动态冻结