代码之家  ›  专栏  ›  技术社区  ›  faceclean

处理“内存不足”的正确方法是什么?

  •  7
  • faceclean  · 技术社区  · 16 年前

    8 回复  |  直到 16 年前
        1
  •  13
  •   John Millikin    16 年前

    malloc() 。这可能就是你的同事们忽视的原因

    • abort() 如果分配失败。例如 GLib and GTK+ 图书馆使用这种方法。

    • 存储“可清除”分配(如缓存)的全局列表,在分配失败时可以清除这些分配。然后,再次尝试分配,如果仍然失败,请通过标准错误报告机制(不执行动态分配)报告。

        2
  •  8
  •   Sinan Ünür    16 年前

    遵循标准化API

    即使在Linux上,ulimit也可以用于获取提示malloc错误返回。只是它默认为无限。

    符合已发布标准的压力是明确的。从长远来看,在大多数系统上,甚至最终在Linux上, malloc(3) 将返回正确的故障指示。确实,桌面系统具有虚拟内存并要求分页,但即使这样也不会进行检查 马洛克(3) 仅在经过调试的程序中工作,没有内存泄漏。如果出了什么问题,有人会想设置一个 ulimit 并追踪它。突然 malloc

        3
  •  2
  •   djna    16 年前

    如果你的应用程序的内存使用是可预测的,那么预先分配一个已知的内存配额并将其分成一些块,从而避免实际耗尽内存的想法是一个好主意。您可以将其扩展到编写自己的内存管理例程,供代码使用。

        4
  •  2
  •   C8H10N4O2    8 年前

    这取决于您正在处理的应用程序的类型。如果应用程序的工作被划分为离散的任务,其中可以允许单个任务失败,那么检查内存分配就可以正常恢复。

    但在许多情况下,响应malloc失败的唯一合理方法是终止程序。允许你的代码在不可避免的空解引用时崩溃就可以实现这一点。当然,最好转储一个日志条目或错误消息来解释错误,但在现实世界中,我们的工作时间表有限。有时,迂腐的错误处理并没有带来投资回报。

        5
  •  1
  •   Larry Watanabe    16 年前

        6
  •  1
  •   user175104    16 年前

        7
  •  1
  •   Juraj    16 年前

    它们在GNU libc信息文档中有很好的记录。

        8
  •  1
  •   Aykhan Hagverdili    4 年前

    static void* xmalloc(size_t sz) {
      void* p = malloc(sz);
      
      if (!p) abort();
    
      return p;
    }