SIGKILL while allocating memory in C++(在 C++ 中分配内存时的 SIGKILL)
问题描述
我正在用 C++ 为内存有限的嵌入式系统 (Tegra 2) 开发应用程序.我在整个代码中处理 new 和
new[]
的 NULL 结果,这有时会发生,但应用程序能够处理这个.
I'm developing application for an embedded system with limited memory (Tegra 2) in C++. I'm handling NULL results of new
and new[]
throughout the code which sometimes occurs but application is able to handle this.
问题在于,如果内存完全耗尽,系统会通过 SIGKILL 杀死进程.我能以某种方式告诉 new
应该只返回 NULL 而不是终止进程吗?
The problem is that the system kills the process by SIGKILL if the memory runs out completely. Can I somehow tell that new
should just return NULL instead of killing the process?
推荐答案
我不确定您使用的是哪种操作系统,但您应该检查一下它支持机会主义内存分配就像Linux一样.
I am not sure what kind of OS You are using, but You should check if it supports opportunistic memory allocation like Linux does.
如果启用,可能会发生以下情况(详细信息/解决方案特定于 Linux 内核):
If it is enabled, the following may happen (details/solution are specific to the Linux kernel):
- 您的
new
或malloc
从内核获取有效地址.即使没有足够的内存,因为... - 内核直到第一次访问的那一刻才真正分配内存.
- 如果所有的overcommitted"内存被使用,操作系统没有机会只能杀死所涉及的进程之一.(告诉程序内存不足为时已晚.)在Linux中,这称为内存不足杀(OOM 杀).此类杀死会记录在内核消息缓冲区中.
- Your
new
ormalloc
gets a valid address from the kernel. Even if there is not enough memory, because ... - The kernel does not really allocate the memory until the very moment of the first access.
- If all of the "overcommitted" memory is used, the operating system has no chance but killing one of the involved processes. (It is too late to tell the program that there is not enough memory.) In Linux, this is called Out Of Memory Kill (OOM Kill). Such kills get logged in the kernel message buffer.
解决方案:禁用内存过度使用:<代码>回声 2 >/proc/sys/vm/overcommit_memory
Solution: Disable overcommitting of memory:
echo 2 > /proc/sys/vm/overcommit_memory
这篇关于在 C++ 中分配内存时的 SIGKILL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 C++ 中分配内存时的 SIGKILL
基础教程推荐
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 使用从字符串中提取的参数调用函数 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01