当内核使用过度使用内存时,是否需要在分配内存后检查NULL

时间:2010-02-12 01:09:03

标签: memory malloc android-ndk

通常的做法是在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(内存被分配或进程被杀死)。 我的假设是对的吗? 便携性不是这个问题的关注点。

5 个答案:

答案 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)的原因!