繁体   English   中英

数组大小(new [])

[英]Size of array (new[])

在调试堆中,我可以获得由new[]创建的数组大小:

int size = *((int *)((char *)ptr - 16));

如果数组的大小小于28(但我不知道为什么?0_0),它正常工作。

这个技巧是否在发布模式下工作(不使用调试堆)?

如何获得阵列的大小(100%工作和稳定)?

您依赖于实现细节。 这就是您的特定实现如何存储放置数组的内存区域的大小。 如您所见,内存区域的大小可能大于分配的数组的大小。

如果你需要知道用new[]分配的数组的大小,你必须保持这个值。

像这样:

std::vector< int > array( 1024 ); // allocate 1024 element array.
int size = array.size();
int sizeInBytes = size * sizeof( int );

;)

你要做的最好的方法就是采用完全依赖编译器/库依赖的东西......一般来说,这是一件非常糟糕的事情,因为你的代码完全不可移植,甚至没有提到下一个您的编译器的版本可能会带有不同的内存分配实现,这会破坏您尝试执行的操作...

任何涉及从CRT挖掘某些东西的方法都是未定义的,不能100%工作。
你唯一的方法是覆盖operator new [],它将在某个地方存储大小,比如分配带有大小前缀的更大的对象。

正如其他人所提到的,您正在使用实现细节来确定分配的数组的大小。 你已经设法弄清楚,如果你从new[]返回的指针的开头向后走16个字节,你就可以得到数组的大小。

16字节的额外分配似乎过多,如果您编译应用程序的发行版本,则很可能不会出现这种情况。 实现可能在您请求的长度之前和之后分配一些额外的字节,并用魔术值填充它以帮助捕获代码超出数组的范围。 这个额外的空间可能不会在发布版本中分配。

此外,您自己提到如果数组大小小于某个阈值,则16字节数似乎不再有效。 如果你分配的对象比你现在分配的任何东西都要大,你可能需要再往后走,才能达到这个大小。

那么,您可以使用的解决方案是:

  • 继续使用new[]分配并保持大小以供以后使用
  • 使用std::vector并使用std::vector::size
  • 如果事先知道数组的大小,并且不需要调整它的大小,请使用std::array 请注意,此选项不会在堆上分配内存(除非您new std::array本身)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM