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

时间:2012-06-15 10:41:15

标签: c++

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

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

阅读C ++ FAQ [16.14] After p = new Fred[n], how does the compiler know there are n objects to be destructed during delete[] p?(以及关于免费商店管理的一般概念的整个部分。)

答案 2 :(得分:1)

  

我的问题是:有没有办法解决这个问题,以便我们在编码时不需要明确提供大小。

您不需要,只需拨打delete [],无大小。

编译器存储大小的方式是实现细节,没有指定。大多数人在阵列开始之前将它存储在一些内存中(而不是像其他人提到的那样)。

请参阅此相关问题:How does delete[] "know" the size of the operand array?

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

C ++编译器具有深埋在某处的动态分配数组的大小;但是,在使用C ++进行编码时,无法以任何方式访问它 - 因此您必须在分配后的某个位置存储大小。

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

答案 5 :(得分:0)

编辑:

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

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

答案 6 :(得分:0)

我认为它依赖于编译器,你无法让它为您的应用程序使用。以下链接显示了编译器使用的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