【问题标题】:Array of objects created dynamically [duplicate]动态创建的对象数组[重复]
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 它的实现方式取决于实现 - 它可以例如改用地图(address -> infoStructure)
  • 我没有说额外的空间必须与数组内容相邻......但如果不是这样,那将是非常不寻常的。
【解决方案2】:

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

【讨论】:

  • 问题是“它怎么知道有 10 个对象要销毁?”
  • @Ben:大小存储在堆中..看我的回答
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2019-07-01
    • 2015-09-08
    • 2021-07-30
    相关资源
    最近更新 更多