【发布时间】:2010-08-02 15:59:26
【问题描述】:
可能重复:
How does delete[] “know” the size of the operand array?
假设我有一个动态创建的对象数组
Car *newcars = new Car[10];
delete [] newcars;
编译器怎么知道有10个对象需要删除。
【问题讨论】:
标签: c++ new-operator
可能重复:
How does delete[] “know” the size of the operand array?
假设我有一个动态创建的对象数组
Car *newcars = new Car[10];
delete [] newcars;
编译器怎么知道有10个对象需要删除。
【问题讨论】:
标签: c++ new-operator
因为new[] 分配的空间多于对象所需的空间。它还为元素的数量分配空间,在调试系统上可能还会分配发生分配的文件和行号,以帮助调试内存泄漏。
在内存管理器内部使用的每个分配中包含额外空间实际上是很常见的。当这种情况发生并且您有缓冲区溢出时,您可能会覆盖这个额外的空间以及分配器保存在那里的任何数据,从而导致“堆损坏”。
【讨论】:
(address -> infoStructure)。
因为该对象有一个析构函数(甚至是默认析构函数),并且它知道有 10 个对象要销毁(它们被解除分配,而不是用新的分配)。使用 new 关键字,它通常分配在堆上。大小存储在“head”段中。
【讨论】:
内存管理器记录分配给每个地址的内容。所以实际上编译器在编译时并不知道(毕竟这样的数组分配可以是动态的),但运行时库知道何时分配内存。
【讨论】: