【问题标题】:Is the size of a dynamically allocated array stored somewhere in RAM? [duplicate]动态分配数组的大小是否存储在 RAM 中的某处? [复制]
【发布时间】:2016-10-02 05:33:53
【问题描述】:

我想知道动态分配数组的大小是否存储在内存中的某个位置,因为在由malloc() 或其家族初始化的指针上调用free() 函数会准确地释放内存。

那么如果free() 确切地知道要释放多少内存,这是否意味着大小值存储在内存中的某个位置?

我们可以检索这个值吗?

【问题讨论】:

标签: c memory memory-management malloc dynamic-memory-allocation


【解决方案1】:

malloc() 是一个库包装函数,用于许多级别的低层内存分配调用。它隐藏了操作系统内存分配器分配的实际内存大小等细节,并直接返回一个有效指针(如果成功)给调用的应用程序。指针可以安全使用(在界限内),并在使用完成后传递给free()。

作为malloc() 的返回值返回的指针不必是(而且大多数时候,它不是)内存分配器返回的实际地址。操作系统/内存分配器在后台做一些簿记以跟踪分配的内存大小,然后经过一些调整,它传递一个指向malloc()的指针,然后返回给调用malloc()的应用程序。

没有标准获取实际信息的方法(它本来是对用户隐藏的,由于正当的原因,恕我直言),但是有平台- 获取信息的依赖方式。

【讨论】:

  • 如果我使用 C 或 C++,行为是否相同?
  • @KevinWallis 为什么要在 C++ 中使用 malloc()?
  • "返回的指针......不是内存分配器返回的实际地址。"不是由 C 指定的。
  • 这确实不是操作系统问题,因为编译器可以在操作系统(如果有的话)提供的任何内容之上分层自己的内存管理。编译器不需要记录它如何处理内存管理以符合 C 规范。
  • @chux 对,我稍微修改了措辞,是不是更好?
【解决方案2】:

很可能;这确实是 C 标准库的一个明智的实现。

但 C 标准不保证。

没有什么能阻止我编写一个符合 C 标准的库,该库总是为每个 malloc 调用分配固定数量的内存! (如果您要求的金额超过该固定值,请适当返回)。那么我不需要将分配的金额存储在任何地方。

【讨论】:

    【解决方案3】:

    如果您使用的是 glibc,则可以使用非标准的 malloc_usable_size 方法。不过,它可能会返回比您分配的字节数更大的数字。

    【讨论】:

    • 它会返回比您分配的更多的字节是有道理的,因为存储在 malloc 分配的内存块的页眉和页脚中的大小值包括页眉和页脚的大小。
    • 页眉和页脚字节不包含在 malloc_usable_size 的返回值中。 malloc 在许多情况下只是分配了比要求更多的内存。不过,何时以及多少额外的内存似乎取决于具体的架构和月球的当前位置。
    【解决方案4】:

    动态分配数组的大小是否存储在 RAM 中的某处?

    也许吧。也许不会。

    C 确实不指定内存管理是如何实现的。如果可移植代码需要为指针分配大小,它必须自己处理。


    某些平台确实提供了辅助功能,因为某些系统确实包含存储在内存中的大小。其他人在指针中编码大小,每块内存的固定大小等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 2011-01-03
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多