【问题标题】:Malloc allocating same block of memorymalloc 分配相同的内存块
【发布时间】:2014-07-01 05:39:27
【问题描述】:

我使用 C 库 malloc 分配 8MB 内存,使用该内存后我使用 free 释放 8MB 内存。

但是当我再次使用malloc 分配8MB 内存时,它分配的位置与之前分配的位置相同。

如何避免这个问题,为什么会这样?

编辑:我正在实现一个测试主内存的工具,如果malloc 分配了相同的内存块,则无法检查整个内存

【问题讨论】:

  • 是什么让你认为这是个问题?
  • 是什么让您认为这是一个问题?您是否阅读过free 的文档?
  • 请解释为什么这是一个问题。如果你释放内存,你不应该挂在任何指向它的指针上。
  • 这行不通。虚拟内存分页使得使用用户空间应用程序测试系统内存变得不可行——无法确保您正在测试所有内存。 (事实上​​,一些物理内存将被内核连接起来,因此将永远被您的应用程序测试。)
  • 在有虚拟内存的操作系统中,即使malloc返回的地址不同,也没有理由认为它会被放在物理内存的不同地址中。

标签: c memory-management malloc


【解决方案1】:

这本身不是问题,是设计使然。 malloc 的典型实现将出于性能原因回收内存块。无论如何,由于 malloc 从有限的值池中返回地址,它无法保证不回收块。

阻止 malloc 返回之前返回的块的唯一可靠方法是停止释放它们。当然,这不是很实用。

我正在实现一个工具来测试主内存。如果 malloc 分配相同的内存块,则无法检查整个内存。

您的主存测试工具无法使用 malloc 或任何用户模式程序来实现。现代操作系统不允许您访问物理内存。相反,它们呈现了内存的虚拟化视图。程序中的地址不是物理地址,它们是虚拟地址。测试物理内存需要您进入比用户模式程序低得多的级别。

【讨论】:

  • 那么会有大块未使用的内存
  • 对不起,你什么意思?
  • 只有当malloc分配的内存被释放后才能被其他程序使用
  • 我还是不懂这些cmets。
  • @Nikhilendra - 您的最后一条评论表明您不了解虚拟内存。操作系统可以随时将进程的内存交换到磁盘,从而释放占用的物理内存,然后另一个进程可以使用。即使不是,每个进程使用相同的 virtual address 空间。
【解决方案2】:

这应该对你有帮助 How malloc works? 为了防止这种情况,使用 malloc/calloc 分配几个字节,然后释放更大的内存块。 顺便说一句,获得相同的内存地址并不是错误的行为。

您可能需要调用 system() 以从您的代码中运行一些 linux 命令(提供详细的内存管理选项)。无法使用 malloc/free 完成/测试主内存管理,它们仅限于在内存上操作在程序运行时分配给您的程序。

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2016-02-13
    • 1970-01-01
    • 2011-01-15
    • 2010-10-12
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多