【发布时间】:2011-01-15 23:31:22
【问题描述】:
通常的做法是在 malloc() 之后检查 NULL(内存是否分配成功),例如
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
在内核中启用内存过量使用后,是否有机会获得 NULL?我应该遵循虔诚地检查每个分配的 NULL 的做法吗?尽管有积极的过度使用机制,malloc 会返回 NULL(我猜值为 1)吗?
事实上,Android内核使用内存过度使用(不确定值,很想知道它(过度使用值)及其意义)。 Android(可能是第 3 方)中的一些框架源代码(C/C++)代码在分配后不会检查 NULL 也不会捕获 bad_alloc。我错过了什么吗?
SO 中有一些关于过度使用内存的线程,但没有一个能解决我的困惑。
编辑: 如果正在使用积极的过度使用,则不会返回 NULL(假设 1)。当没有可用的物理内存并且尝试访问分配的内存(写入分配的内存)时,OOM 将终止一些进程并为应用程序分配内存,直到它被依次终止(假设 2)。在任何一种情况下,我都认为不需要检查 NULL(内存被分配或进程被杀死)。
我的假设是否正确?
可移植性不是这个问题的关注点。
【问题讨论】:
-
什么是overcommit memory?如果您在谈论设备上的页面文件,那么不,Android(和其他移动设备)通常不使用页面文件。这是因为写入会更快地耗尽 SSD 的 NAND 或闪存。还是您在谈论模拟器和虚拟机管理程序?
-
使用 OOM-Killer 和 Memory Overcommit,在 malloc 之后检查空指针不再是必要的并且会产生误导。
标签: memory malloc android-ndk