动态创建的对象数组

时间:2010-08-02 15:59:26

标签: c++ new-operator

  

可能重复:
  How does delete[] “know” the size of the operand array?

假设我有一个动态创建的对象数组

Car *newcars = new Car[10];
delete [] newcars;

编译器如何知道有10个对象需要删除。

3 个答案:

答案 0 :(得分:3)

因为new[]分配的空间超过了对象所需的空间。它还为元素数量分配空间,在调试系统上也可能是分配发生的文件和行号,以帮助调试内存泄漏。

在内存管理器内部使用的每个分配中包含额外空间实际上非常常见。当发生这种情况并且您有缓冲区溢出时,您可能会覆盖此额外空间以及分配器保留的任何数据,从而导致“堆损坏”。

答案 1 :(得分:0)

因为对象有一个析构函数(甚至是一个默认的析构函数),它知道有10个要销毁的对象(它们被解除分配而不是分配给new)。使用new关键字,它通常在堆上分配。大小存储在“头部”段中。

答案 2 :(得分:0)

内存管理器记录分配给每个地址的内容。所以实际上编译器在编译时并不知道(在所有这些数组分配都是动态的之后),但运行时库知道何时分配内存。