我正在开发C ++中具有有限内存(Tegra 2)的嵌入式系统的应用程序。我在整个代码中处理new
和new[]
的NULL结果,有时会发生但是应用程序能够处理这个。
问题是如果内存完全耗尽,系统会通过SIGKILL终止进程。我可以以某种方式告诉new
应该只返回NULL而不是杀死进程吗?
答案 0 :(得分:12)
我不确定您使用的操作系统类型,但您应该检查是否 它像Linux一样支持opportunistic memory allocation。
如果启用,可能会发生以下情况:
new
或malloc
从内核获取有效地址。 即使没有足够的内存,因为...... 解决方案:禁用内存过量使用:
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/