代码之家  ›  专栏  ›  技术社区  ›  FL4SOF

当内核使用超量内存时,分配内存后是否需要检查空值?

  •  26
  • FL4SOF  · 技术社区  · 15 年前

    通常在malloc()之后检查是否为空(是否成功分配内存),例如

    void *ptr = malloc(10);    
    if (ptr != NULL) {  
      // do some thing usefull  
    } else {  
     // no memory. safely return/throw ...  
    }  
    

    在内核中启用内存超量时,是否有可能获得空值?我应该认真检查每个分配的空值吗?malloc是否会在aggresive overcommit机制中返回空值(我猜值为1)?

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

    关于过度使用的内存,有一些这样的线程,但是没有一个线程解决了我的困惑。

    编辑: 如果采用积极的过度承诺,则不会返回空值(假设1)。当没有可用的物理内存并且正在尝试访问分配的内存(写入分配的内存)时,OOM将终止一些进程并为应用程序分配内存,直到它依次被终止(假设2)。在这两种情况下,我都不需要设置为空(分配内存或杀死进程)。 我的假设是对的吗?
    可移植性不是这个问题的一个问题。

    5 回复  |  直到 6 年前
        1
  •  37
  •   CB Bailey    15 年前

    是的,您仍然应该检查 malloc . 在一个过度使用内存的环境中,当您写入以前调用分配给程序的部分地址空间时,由于环境中的物理存储空间不足,您将无法检测到故障并从故障中恢复。 马洛克 .

    然而,这并不是唯一会导致 马洛克 在传统环境中失败。当程序的地址空间变得支离破碎时,对特别大的内存块的请求可能会失败,即使可能有足够的总物理内存来满足请求。因为没有连续的可用地址空间范围 马洛克 必须失败。此类故障必须通过以下方式发出信号: 马洛克 返回 NULL ,无论环境是否过度使用内存。

        2
  •  8
  •   osgx    15 年前

    必须检查返回值是否为空 每一个 时间。任何库函数都可能失败。甚至fclose()do(在断开的NFS共享上,而来自nfs文件fclose的错误意味着数据没有保存)。

    大多数软件写得不好,不包含所有检查。

    malloc不能返回空值或指针以外的值。全部还是全部。如果你要求10,就不能从malloc得到1个字节。

        3
  •  2
  •   t0mm13b    15 年前

    建议在所有可能返回空值的函数调用中严格检查空值,不管内核是否有过多的可提交内存。

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

    void *ptr = malloc(10);
    if (ptr != NULL){
       /* Do something here with ptr */
    }else{
       /* Do something here if it fails */
    }
    

    文件操作,内存操作到名称,但少数会在失败时返回空值。

    希望这有帮助, 最好的问候, 汤姆。

        4
  •  1
  •   Asif Bahrainwala    7 年前

    嗯……在Linux上,由于内存没有页面备份(最初),而且只在第一次读/写之后创建页面备份,所以操作系统总是会成功地为您提供内存(除非您耗尽了地址空间,否则在64位系统中是不可能的)。因此,如果它耗尽了内存,不能给你承诺的内存,OOM杀手将杀死你的应用程序或其他一些应用程序,为你提供所需的页面支持。所以不管你是否做了空检查,出来的都是一样的,崩溃了……

        5
  •  -5
  •   Danger Saints    6 年前

    不,不需要检查malloc的结果。

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

    “OOM杀手和超员”是更好的选择。

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

    这就是为什么您应该切换到Linux_或Android_的原因!