代码之家  ›  专栏  ›  技术社区  ›  Aykhan Hagverdili

我可以像'delete[]'那样获取动态分配数组的大小吗?

  •  1
  • Aykhan Hagverdili  · 技术社区  · 5 年前

    我在想怎么做 delete[] 知道动态分配数组的大小,我发现 this 问题(以及 this 关于微软论坛的问题,但答案是相似的)。结果证明 answer

    这通常存储在分配内存之前的“head”段中。

    因此,具体细节是特定于实现的。
    在这个答案下,其中一条评论问,为什么程序员不能得到这条非常有用的信息,这迫使我们传递表示大小的变量。评论得到的答案是

    强制分配器存储请求的大小(这样您就不需要自己传递数组大小)可能是一个小问题,但它可能会对可能的分配器设计产生性能影响。

    对我来说,考虑到尺寸应该是 删除[ ] 总之。

    我的问题是:有没有可能(对于程序员)以某种方式检索大小?

    我知道有一种微软的特殊方式(正如前面提到的微软论坛中提到的那样),但我在追求一些标准化的东西。

    您可以使用Microsoft特定的函数_msize()来 从中获取动态分配数组的大小 指针,即使它被传递给另一个函数 分配任务的人。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Cheiron    5 年前

    如果您使用开放源码库,那么是的,您可以!只需查找源代码,找出方法并找到它。

    不过,这仍然是一个坏主意,因为没有任何保证:实现可能在任何时候发生变化,而且即使在UNIX和Linux之间也不能保证是可移植的。这个数字也可能太大,因为分配更多可能是有利的,例如对齐。 这也是不必要的:当你 new 一个你知道大小的空间。你可以通过它,或者把它储存在你控制的地方。这并不比通过malloc的实现进行查找更糟糕。

        2
  •  1
  •   Aykhan Hagverdili    5 年前

    我的结论是:
    数组的大小可以存储在内存中,但不一定如此;还有其他实现所需行为的方法,每种方法都有自己的权衡,并且iso专门为编译器编写者提供了选择的自由,以便他们可以根据需要对其进行优化。
    也就是说,目前还没有一种单一的、标准化的方法来获取动态分配数组的大小。