当delete []指针工作时,为什么不能得到指向数组的大小?

Pro*_*ala 9 c++

使用堆分配数组的常用方法是:

SomeType * arr = new SomeType[15454];
//... somewhere else 
delete [] arr;
Run Code Online (Sandbox Code Playgroud)

为了delete [] arr使C运行时必须知道与指针相关的内存缓冲区的长度.我对吗?

所以原则上应该可以以某种方式访问​​信息?可以使用某个库访问吗?我是在想.我知道它不是语言的核心部分,因此它将取决于平台.

Mik*_*kis 6

你做对了.信息就在那里.但是没有标准的方法来获得它.

如果您正在使用Windows,则有一种_msize()方法可能会为您提供内存块的大小,但它可能不一定准确.(报告的内存块大小可以向上舍入到最近的较大对齐点.)请参阅MSDN - _msize

如果这是你真正必须拥有的东西,你可以试试你的运气,重写new,分配稍大的内存块,在开头存储它的大小,并在大小后返回一个指向字节的指针.然后你可以编写自己的msize()返回该大小.当然你还需要覆盖delete.但这太麻烦了,如果可以,最好避免它.如果你这样走,你会发现只有痛苦.


Ser*_*sta 5

信息存在.遗憾的是,标准未指定应如何分配动态内存,也未指定如何提取已分配块的大小.

这意味着每个实现都可以做到它想要的.经典方式是:

  • 存储所有已分配/空闲块及其开头和大小的分配表 - 除了表中的搜索外,易于实现
  • 动态分配的内存区域之前和之后的保留区域 - 实现实际上分配区域:前导码 - dynamic_memory - 后同步码.前导/后同步包含与其他区域,大小和状态的链接信息.在解除分配时,可以控制前同步码/后同步码完整性以选择性地发出可能的存储器覆盖的警告.前导码是呈现给程序的动态存储器之前的存储器.

但是,由于没有指定任何内容,您将不得不深入了解实现的内部.通常,阅读malloc/free源是最好的信息来源.