SIGKILL在用C ++分配内存时

时间:2012-08-02 14:00:30

标签: c++ memory-management sigkill

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

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

2 个答案:

答案 0 :(得分:12)

我不确定您使用的操作系统类型,但您应该检查是否 它像Linux一样支持opportunistic memory allocation

如果启用,可能会发生以下情况:

  1. 您的newmalloc从内核获取有效地址。 即使没有足够的内存,因为......
  2. 直到第一次访问的那一刻,内核才真正分配内存。
  3. 如果使用了所有“过度使用”的内存,操作系统就没有机会杀死其中一个涉及的进程。 (现在告诉程序没有足够的内存已经太晚了。)在Linux中,这称为Out Of Memory Kill (OOM Kill)。此类杀戮会记录在内核消息缓冲区中。
  4. 解决方案:禁用内存过量使用: echo 2 > /proc/sys/vm/overcommit_memory

答案 1 :(得分:1)

我想到了两个想法。

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

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