通常的做法是在malloc()之后检查NULL(是否成功分配内存),有点像
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
在内核中启用了内存过量使用,是否有可能获得NULL?我应该遵循宗教检查每次分配NULL的做法吗?尽管有积极的过度使用机制(我猜值1),malloc会返回NULL吗?
事实上,Android内核使用内存过量使用(不确定值,很想知道它(过度使用值)及其意义)。 Android中的一些框架源代码(C / C ++)代码(可能是第三方)不会检查NULL,也不会在分配后捕获bad_alloc。我错过了什么吗?
SO中有一些关于过度使用内存的线程,但没有一个解决了我的困惑。
编辑:如果采用积极的过度使用,则不会返回NULL(假设1)。当没有可用的物理内存并尝试访问分配的内存(写入分配的内存)时,OOM将终止某个进程并为应用程序分配内存,直到它被依次终止(假设2)。在任何一种情况下,我都没有看到任何需要检查NULL(内存被分配或进程被杀死)。 我的假设是对的吗? 便携性不是这个问题的关注点。
答案 0 :(得分:38)
是的,您仍应检查malloc
返回的失败。在过度使用内存的环境中,当您通过先前调用{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ 1}}。
但是,这不是导致malloc
在传统环境中失败的唯一问题。当程序的地址空间碎片化时,对特定大块内存的请求可能会失败,即使可能有足够的总物理内存来满足请求。因为没有连续范围的空闲地址空间malloc
必须失败。无论环境是否过度使用内存,malloc
返回malloc
都必须发出此类故障信号。
答案 1 :(得分:8)
您必须检查NULL 每时间的返回值。任何库函数都可能失败。甚至fclose()也可以(在断开连接的NFS共享上,以及来自NFS文件fclose的错误意味着,数据未保存)。
大部分软件编写得很糟糕,并不包含所有检查。
malloc不能返回NULL或指针以外的东西。全有或全无。如果要求10,则无法从malloc获得1个字节。
答案 2 :(得分:2)
建议在所有可能返回NULL的函数调用中检查NULL,无论内核是否具有过度可提交的内存。
以下以下代码段显示了如何检查对malloc
的调用是否有效......
void *ptr = malloc(10); if (ptr != NULL){ /* Do something here with ptr */ }else{ /* Do something here if it fails */ }
文件操作,命名的内存操作,但有些会在失败时返回NULL。
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:1)
嗯......在Linux上,因为内存不是页面备份(最初)并且只在第一次读/写后创建页面备份,操作系统将始终成功为您提供内存(除非您耗尽了地址空间,这是不可能的64位系统)。因此,如果内存不足并且无法提供承诺的内存,OOM杀手就会杀死您的应用程序或其他应用程序,为您提供所需的页面支持。所以无论你是否进行NULL检查,结果都是一样的,一次崩溃.......
答案 4 :(得分:-5)
不,没有必要检查malloc的结果。
在malloc失败之前,操作系统已经遇到了很多问题。
" OOM-Killer和overcommit"将是一个更好的选择。
什么?您的操作系统不支持" OOM-Killer和overcommit"?
这就是你应该切换到Linux(或Android)的原因!