动态分配数组的大小

Tim*_*Tim 15 c c++ dynamic-allocation

分配给动态分配的数组的起始地址的指针是否不具有数组大小的信息?所以我们必须使用另一个变量来存储它的大小,以便稍后通过指针处理数组.

但是当我们释放动态分配的数组时,我们不指定大小,而只是"free ptr"或"delete [] ptr".如何释放或删除知道数组的大小?我们可以使用相同的方案来避免将数组的大小存储在另一个变量中吗?

谢谢!

Eli*_*sky 18

是的,这是真的.

delete知道内存块的大小,因为new向块添加了额外的信息(通常在返回给用户的区域之前),包含其大小以及其他信息.请注意,这些都是特定于实现的,不应该由您的代码使用.

所以回答你的最后一个问题: - 我们不能使用它 - 它是一个高度平台和编译器相关的实现细节.


例如,在K&R2中演示的示例内存分配器中,这是在每个已分配的块之前放置的"标头":

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;
Run Code Online (Sandbox Code Playgroud)

size是已分配块的大小(然后由free或使用delete).


Kor*_*icz 7

有趣的是,历史上它就是delete [20] arr;这样arr = new int[20].然而,实践证明,分配器可以无痛地存储大小信息,并且由于大多数人使用它然后无论如何都存储它,它被添加到标准中.

更有趣,也鲜为人知的是,这种"扩展删除语法"实际上是由少数C++编译器支持的(尽管即使面对C++ 98标准也是如此),尽管没有人需要它.

int* arr = new int[20];
delete [20] arr;
Run Code Online (Sandbox Code Playgroud)

然而,关于这一切的可悲部分是,没有符合标准的方法来检索通过尺寸供您自己使用: - /