使用堆分配数组的常用方法是:
SomeType * arr = new SomeType[15454];
//... somewhere else
delete [] arr;
为了执行delete [] arr
,C运行时必须知道与指针关联的内存缓冲区的长度。我是对的吗?
原则上应该可以以某种方式访问信息吗?可以使用某个库访问吗?我是在想。我知道它不是语言的核心部分,因此它将取决于平台。
答案 0 :(得分:6)
你做对了。信息就在那里。但是没有标准的方法来获得它。
如果您使用的是Windows,则会有一个_msize()
方法,它可能会为您提供内存块的大小,但它可能不一定准确。 (报告的内存块大小可以向上舍入到最近的较大对齐点。)请参阅MSDN -
_msize
如果这是你真正必须拥有的东西,你可以试试你的运气,覆盖new
,分配一个稍大的内存块,在开头存储它的大小,并在大小之后返回指向字节的指针。然后你可以编写自己的msize()
来返回那个大小。当然,您还需要覆盖delete
。但这太麻烦了,如果可以,最好避免它。如果你这样走,你会发现只有痛苦。
答案 1 :(得分:5)
信息存在。不幸的是,标准没有规定应该如何分配动态内存,也不指定如何提取分配块的大小。
这意味着每个实现都可以做到它想要的。经典方式是:
但是,由于没有指定任何内容,您将不得不深入了解实现的内部。通常,阅读malloc / free源是最好的信息来源。
答案 2 :(得分:-6)
事实是delete[]
不知道已分配的数组的确切大小,但它知道通过对new[]
的相应调用分配了多少内存。通常没有分配多余的内存,因此两个数字匹配。但是,你不能依赖它。这不是标准的一部分,因为没有可靠的方法来了解动态分配的数组的大小。