在 C++ 中分配内存时发出 SIGKILL
Posted
技术标签:
【中文标题】在 C++ 中分配内存时发出 SIGKILL【英文标题】:SIGKILL while allocating memory in C++ 【发布时间】:2012-08-02 14:00:30 【问题描述】:我正在为 C++ 中内存有限的嵌入式系统 (Tegra 2) 开发应用程序。我在整个代码中处理 new
和 new[]
的 NULL 结果,这有时会发生,但应用程序能够处理。
问题是如果内存完全耗尽,系统会通过 SIGKILL 杀死进程。我能以某种方式告诉new
应该只返回 NULL 而不是终止进程吗?
【问题讨论】:
我不确定,但你可以尝试使用“new (nothrow)”cplusplus.com/reference/std/new/nothrow 我在大多数情况下都会这样做,当然当我分配更多的内存时。在某些情况下,我懒得将 new 重写为 new(std::nothrow) 但我认为该进程会以异常而不是 SIGKILL 终止。 【参考方案1】:我不确定您使用的是哪种操作系统,但您应该检查一下 它像 Linux 一样支持opportunistic memory allocation。
如果启用,可能会发生以下情况(详细信息/解决方案特定于 Linux 内核):
-
您的
new
或malloc
从内核获取有效地址。 即使内存不够,因为...
内核直到第一次访问的那一刻才真正分配内存。
如果使用了所有“过度使用”的内存,操作系统就没有机会杀死其中一个相关进程。 (告诉程序内存不足为时已晚。)在 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 数组元素时,分配的字符被破坏?