这是真的,分配到一个动态分配的数组的起始地址的指针不具有阵列的大小的信息?因此,我们必须使用另一个变量来存储其大小为后来通过指针处理数组。

但是,当我们释放动态分配的数组,我们没有指定的大小,而不是我们只是“自由的ptr”或“删除[] PTR”。怎么能释放或删除知道数组的大小?我们可以使用相同的方案来避免存储阵列的大小在另一变量?

谢谢!

有帮助吗?

解决方案

是,这是事实。

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;

size是所分配的块的大小(这是随后被free,或delete)。

其他提示

有趣的是,在历史上它被delete [20] arr;只是因为它是arr = new int[20]。然而实践证明,关于大小的信息可以通过分配器来无痛存储,并且因为使用它大多数人则存储也无妨,它被添加到标准。

什么是更有趣,鲜为人知,是一个事实,即这种“扩展删除语法”实际上是由少数的C ++编译器的支持(尽管即使是在C ++ 98的标准面是不正确的),尽管没有要求它

int* arr = new int[20];
delete [20] arr;

但是所有关于这个不幸的是,没有取回自己使用的是通过大小符合标准的方式: - /

这是事实,该阵列不包含该阵列的尺寸,则必须存储该信息供以后使用。当删除通过delete阵列或free它是将指针传递所分配的存储器。内存管理器使用(无论是由系统或自己的自定义从覆盖new和delete)知道被释放的内存区域,并跟踪它。希望这是很有意义的。

是的,这是真的。这就是为什么你应该很少尝试直接解决这个问题,并使用标准的容器而不是一部分。关于是有意义的对付它的唯一的一次是,如果你决定实现自己的容器(在这种情况下,你通常跟踪你的容器的实现大小的信息)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top