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

时间:2017-08-04 10:06:19

标签: c++

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

SomeType * arr = new SomeType[15454];
//... somewhere else 
delete [] arr;

为了执行delete [] arr,C运行时必须知道与指针关联的内存缓冲区的长度。我是对的吗?

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

信息存在。不幸的是,标准没有规定应该如何分配动态内存,也不指定如何提取分配块的大小。

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

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

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

答案 2 :(得分:-6)

事实是delete[]不知道已分配的数组的确切大小,但它知道通过对new[]的相应调用分配了多少内存。通常没有分配多余的内存,因此两个数字匹配。但是,你不能依赖它。这不是标准的一部分,因为没有可靠的方法来了解动态分配的数组的大小。