![](/img/trans.png)
[英]Can I delete[] a pointer that points into an allocated array, but not to the start of it?
[英]Can I get the size of a dynamicly allocated array the way `delete[]` does?
我想知道delete[]
是如何知道动态分配数组的大小的,我发现了这个问题(以及 Microsoft 论坛上的这个问题,但答案是相似的)。 原来答案是
这通常存储在您分配的内存之前的“头”段中。
因此,确切的细节是特定于实现的。
在该回答下,其中一条评论询问为什么程序员无法获得这条非常有用的信息,这迫使我们传递表示大小的变量。 评论得到的答案是
强制分配器存储请求的大小(这样您就不需要自己传递数组大小)可能是一个小麻烦,但它可能会对可想象的分配器设计产生性能影响
对我来说,考虑到delete[]
无论如何都应该可以访问大小,这并不是很有说服力。
我的问题:是否有可能(对于程序员)以某种方式检索大小?
我知道微软有一种特殊的方式(正如前面提到的 MS 论坛中所指出的那样),但我追求的是标准化。
您可以使用 Microsoft 特定函数 _msize() 从指针获取动态分配数组的大小,即使它被传递给另一个函数而不是进行分配的函数。
如果您使用开源库,那么是的,您可以,只需查找源代码即可。 弄清楚如何去做。
但这仍然是一个坏主意,因为没有任何保证:实现可能随时更改,并且不能保证即使在 Unix 和 Linux 之间也是可移植的。 这个数字也可能太大,因为分配更多可能是有利的,例如对齐。 这也是不必要的:当你new
一个空间时,你就知道它的大小。 你可以传递它,或者将它存储在你控制的某个地方。 这并不比通过 malloc 的实现查找它更糟糕。
我的结论是:
数组的大小可能存储在内存中,但不一定如此; 还有其他方法可以实现所需的行为,每种方法都有自己的权衡取舍,ISO 专门为编译器编写者提供了选择的自由,以便他们可以根据需要对其进行优化。
也就是说,目前还没有一种单一的、标准化的方法来获取动态分配数组的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.