【问题标题】:How does delete[] know how much memory to delete? [duplicate]delete[] 如何知道要删除多少内存? [复制]
【发布时间】:2014-02-24 09:38:56
【问题描述】:
int* i = new int[4];
delete[] i;
  1. 当我们调用 delete[] 时,程序如何知道“i”是 4 字节长度。 4 是否存储在内存中的某个位置?
  2. delete[] 的实现依赖于系统还是编译器?
  3. 是否有一些系统 API 可以获取 i 的长度?

正如 Hades 所说,哪个会保存已分配多少内存的信息?在哪里? 它必须保存在内存中,或者可能在指针 i 附近。

【问题讨论】:

  • 我没有 4 字节长度

标签: c++ delete-operator


【解决方案1】:

首先,i 不是“4 字节长度”。相反,i 是一个指向四个整数数组的指针。

接下来,delete[] 不需要知道任何东西,因为int 没有析构函数。所要做的就是释放内存,这是由系统的分配器完成的。这与free(p) 的情况相同——您不需要告诉free 需要释放多少内存,因为您希望它能够解决这个问题。

需要调用析构函数时情况不同;在这种情况下,C++ 实现确实需要分别记住 C++ 对象的数量。这个方法取决于实现,尽管许多编译器遵循流行的Itanium ABI,它允许将这些不同编译器编译的目标代码链接在一起。

您无法查询此信息。您应该将动态数组视为 C++ 的错误特征;基本上没有理由使用它们*,并且您总是可以使用某种单独和单独管理内存和对象的类做得更好:由于无论如何您都必须记住数组元素的数量,因此最好封装大小和分配在一个连贯的类中,而不是有模糊的动态数组,如果不传递额外的信息就无法真正使用(除非你有自终止语义,但你只会为终止符使用额外的空间) .

*) 而且动态数组至少有两个标准缺陷,没有人会费心去修复

【讨论】:

  • 这不能回答 OP 的问题。也许你应该阅读一篇关于 malloc 是如何实现的文章
  • @texasbruce:问题不在于malloc
  • @KerrekSB 这是关于内存分配的,它将使用malloc,或类似的东西。您只解释了其中的一部分(并且只解释了其中最流行的实现)。目前尚不清楚 OP 询问的是哪一部分。
  • @JamesKanze:问题是关于数组删除的。我认为这是专门关于数组的。否则,OP 可能会询问普通删除是如何工作的。这也很有趣,但却是一个非常独立的问题。
  • 大多数编译器使用 malloc 作为底层调用来为 new 运算符分配内存
【解决方案2】:

当你动态分配内存时;编译器会分配一个额外的内存块,除了您所要求的之外,它将保存信息how much memory has been allocated。 当您尝试使用 delete 删除此内存时,编译器将读取此额外的内存块,以查看分配了多少内存并相应地释放空间。

我认为没有任何 API 可以获取此信息。

【讨论】:

  • 不能保证,实际上这里也不是这样。
  • 编译器不分配内存也不读取它。
  • @KerrekSB 不能保证,但我不知道有什么不同的实现。基本的内存管理必须知道以某种方式释放的实际字节数,这意味着分配的块将包含一个隐藏的前缀,它包含块中的字节数,或者(更常见的是,至少在我的实现中)已经看到),指向下一个块(可能已分配或空闲)开始的指针。
  • @JamesKanze:请参阅 Itanium ABI:对于可简单破坏的类型,没有数组 cookie。
  • @KerremSB 这实际上是正确的答案。在 malloc/new 分配内存时,几乎总会有一个开销 struct 用来存储内存块的信息。
猜你喜欢
  • 2011-01-20
  • 2010-12-30
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2017-01-20
  • 2018-04-03
相关资源
最近更新 更多