在 C++ 中分配内存时发出 SIGKILL

Posted

技术标签:

【中文标题】在 C++ 中分配内存时发出 SIGKILL【英文标题】:SIGKILL while allocating memory in C++ 【发布时间】:2012-08-02 14:00:30 【问题描述】:

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

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

【问题讨论】:

我不确定,但你可以尝试使用“new (nothrow)”cplusplus.com/reference/std/new/nothrow 我在大多数情况下都会这样做,当然当我分配更多的内存时。在某些情况下,我懒得将 new 重写为 new(std::nothrow) 但我认为该进程会以异常而不是 SIGKILL 终止。 【参考方案1】:

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

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

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

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

【讨论】:

您从不确定 OP 使用哪种操作系统开始,然后以特定于 Linux 的解决方案结束。最好从一开始就假设 Linux,或者警告解决方案是特定于 Linux 的。 @Ruslan,你是对的。我添加了一个提示。【参考方案2】:

想到了两个想法。

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

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

【讨论】:

add 1) 是的,这是一种解决方法,但如果有基于系统配置的解决方案,我就懒得走这条路了。与“真正的”嵌入式系统相比,它是 Open Embedded distrubution 的重量级。我不知道是否有任何用于特殊内存分配的 API。有什么提示吗?添加 2) 很棒的见解,我会尝试的。 如果原因是操作系统过度使用,这些方法不太可能有帮助。 Black's answer 地址。

以上是关于在 C++ 中分配内存时发出 SIGKILL的主要内容,如果未能解决你的问题,请参考以下文章

如果我在 C++ 中的一个线程中分配内存,我可以在另一个线程中取消分配它吗

为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?

如何在 C++ 中分配一个大的动态数组?

JAVA里String数组在内存分配中分配的空间每个占几个字节?

有没有办法为 NUMA 中的数据分配特定的内存?

类中声明的变量的内存分配