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

Memory 当内核使用过量内存时,是否需要在分配内存后检查NULL,memory,malloc,android-ndk,Memory,Malloc,Android Ndk,通常的做法是在malloc()之后检查NULL(内存是否已成功分配),例如 void *ptr = malloc(10); if (ptr != NULL) { // do some thing usefull } else { // no memory. safely return/throw ... } 在内核中启用了内存过度使用的情况下,是否有可能出现空值?我是否应该遵循每次分配都严格检查NULL的做法?malloc是否会返回NULL,尽管存在攻击性的过

通常的做法是在malloc()之后检查NULL(内存是否已成功分配),例如

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  
在内核中启用了内存过度使用的情况下,是否有可能出现空值?我是否应该遵循每次分配都严格检查NULL的做法?malloc是否会返回NULL,尽管存在攻击性的过度提交机制(我猜值为1)

事实上,Android内核使用内存过量(不确定值,希望知道它(过量值)及其意义)。Android中的一些框架源代码(C/C++)(可能是第三方代码)在分配后既不检查NULL也不捕获bad_alloc。我错过什么了吗

在SO中有一些关于过度使用内存的线程,但没有一个解决了我的困惑

编辑:如果采用积极的过度限制,则不会返回NULL(假设1)。当没有可用的物理内存并且尝试访问分配的内存(写入分配的内存)时,OOM将终止一些进程并为应用程序分配内存,直到它依次终止(假设2)。在这两种情况下,我都不认为有必要检查NULL(内存被分配或进程被终止)。 我的假设正确吗?

可移植性与此问题无关。

您必须每隔一次检查NULL的返回值。任何库函数都可能失败。甚至fclose()也可以(在断开连接的NFS共享上,NFS文件的fclose错误意味着数据未保存)

大多数软件都写得很糟糕,并且没有包含所有的检查


malloc只能返回NULL或指针。要么全有,要么一无所有。如果请求10,则无法从malloc中获取1字节。

建议在所有可能返回NULL的函数调用中仔细检查NULL,无论内核是否有过多的可提交内存

下面的代码段显示了如何检查对
malloc
的调用是否有效

void *ptr = malloc(10); if (ptr != NULL){ /* Do something here with ptr */ }else{ /* Do something here if it fails */ } void*ptr=malloc(10); 如果(ptr!=NULL){ /*在这里用ptr做点什么*/ }否则{ /*如果失败,在这里做点什么*/ } 文件操作、内存操作(仅少数操作)失败时将返回空值

希望这有帮助, 顺致敬意,
Tom。

是的,您仍然应该检查
malloc
返回的故障。在过度使用内存的环境中,当您写入以前调用
malloc
分配给程序的部分地址空间时,由于环境耗尽了所需的物理存储,您将无法检测到故障并从故障中恢复


然而,这不是在传统环境中导致
malloc
失败的唯一问题。当程序的地址空间变得碎片化时,请求特别大的内存块可能会失败,即使可能有足够的总物理内存来满足请求。因为没有连续的可用地址空间范围
malloc
必须失败。无论环境是否过度使用内存,这种类型的故障都必须由返回的
malloc
发出信号。

否,无需检查malloc的结果

早在malloc失败之前,操作系统就已经遇到了很多问题

“OOM杀手和过度承诺”将是一个更好的选择

什么?您的操作系统不支持“OOM Killer and Overmit”


这就是为什么你应该切换到Linux(或Android)

好吧……在Linux上,由于内存不是页备份的(最初),并且只在第一次读/写之后创建页备份,所以操作系统将始终成功地为您提供内存(除非您耗尽了地址空间,这在64位系统中是不可能的)。因此,如果内存不足,无法提供承诺的内存,OOM killer只会杀死您的应用程序或其他应用程序,为您提供所需的页面支持。因此,无论你是否做空检查,结果都是一样的,崩溃

我的问题不是malloc的实现,而是malloc的使用。如果启用了内存过度使用,则(理论上)获得空值的可能性会非常小,这在一些android c/c++框架源代码中很明显,这些源代码在分配后不会执行此检查。使用过度使用,mallic将进一步失败。一般来说,malloc不会失败,当内存可用且未达到ulimit时,“使用overmit malloc时,malloc将进一步失败”。我相信这是错误的假设,请查看您提到的链接。上面写着demo1:malloc内存,不使用它:分配1.4TB,被OOM杀手杀死demo2:malloc内存,立即使用它:分配7.8GB,被OOM杀手杀死(进程被OOM杀手杀死,不是malloc失败的情况)。demo1-分配内存,不使用分配的内存-所以过度使用会起作用,页面将不会真正分配。demo2-分配内存并
memset
将其设置为0(这将把这个内存从写保护的0页重新映射到实际内存,因此它会禁止过度使用)在典型的Android box上启用它,在那里交换?“代码段是一个危险的假设‘你能解释吗?’我应该说,Android中间件“很抱歉这么通用”,Android中的一些框架源代码(C/C++)。我将编辑我的问题。也许这是离题,但我很好奇在/*如果失败,在这里做点什么*/部分你会采取什么行动?如果您确实无法分配10字节的内存,那么无论您做什么,都可能无法分配内存。您可能会进入一个无限循环,检查内存不足并处理它。。你就这样离开吗?这是不是比以某种方式破坏空引用要好?你的答案是一个无关的咆哮。我拿走了一半。而且你的答案不好,所以我投了反对票。