可能重复:
How does delete[] “know” the size of the operand array?
假设我有一个动态创建的对象数组
Car *newcars = new Car[10];
delete [] newcars;
编译器如何知道有10个对象需要删除。
答案 0 :(得分:3)
因为new[]
分配的空间超过了对象所需的空间。它还为元素数量分配空间,在调试系统上也可能是分配发生的文件和行号,以帮助调试内存泄漏。
在内存管理器内部使用的每个分配中包含额外空间实际上非常常见。当发生这种情况并且您有缓冲区溢出时,您可能会覆盖此额外空间以及分配器保留的任何数据,从而导致“堆损坏”。
答案 1 :(得分:0)
因为对象有一个析构函数(甚至是一个默认的析构函数),它知道有10个要销毁的对象(它们被解除分配而不是分配给new)。使用new关键字,它通常在堆上分配。大小存储在“头部”段中。
答案 2 :(得分:0)
内存管理器记录分配给每个地址的内容。所以实际上编译器在编译时并不知道(在所有这些数组分配都是动态的之后),但运行时库知道何时分配内存。