11

我正在为 C++ 中内存有限的嵌入式系统(Tegra 2)开发应用程序。我正在处理有时会出现的代码newnew[]整个代码的 NULL 结果,但应用程序能够处理这个问题。

问题是如果内存完全耗尽,系统会通过 SIGKILL 杀死进程。我能以某种方式告诉它new应该只返回 NULL 而不是终止进程吗?

4

2 回答 2

16

我不确定您使用的是哪种操作系统,但您应该检查它是否支持像 Linux 那样的机会性内存分配。

如果启用,可能会发生以下情况(详细信息/解决方案特定于 Linux 内核):

  1. 您的newormalloc从内核获取有效地址。即使没有足够的内存,因为...
  2. 直到第一次访问的那一刻,内核才真正分配内存。
  3. 如果使用了所有“过度使用”的内存,操作系统就没有机会杀死其中一个相关进程。(告诉程序内存不足已经来不及了。)在 Linux 中,这称为Out Of Memory Kill (OOM Kill)。这样的杀戮记录在内核消息缓冲区中。

解决方案:禁用内存过度使用: echo 2 > /proc/sys/vm/overcommit_memory

于 2012-08-02T15:00:33.890 回答
1

有两个想法浮现在脑海。

  1. 编写自己的内存分配函数而不是直接依赖new。您提到您在嵌入式系统上,其中特殊分配器在应用程序中非常常见。您是直接在硬件上运行应用程序,还是在执行/OS 层下的进程中运行?如果是后者,是否提供了用于分配内存的系统 API?

  2. 查看 C++ set_new_handler,看看它是否可以帮助您。new您可以请求在分配失败时调用特殊函数。也许在该功能中,您可以采取措施来防止任何杀死进程的执行。参考:http ://www.cplusplus.com/reference/std/new/set_new_handler/

于 2012-08-02T14:12:44.860 回答