是否需要检查NULL后分配存储器,当核使用过量使用的存储器
-
20-09-2019 - |
题
它是一般的做法检查NULL(是否存储器是成功地分配)之后malloc(),一些东西喜欢
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
与存储器的过量使用启用在内核,是否有机会获得空?我应该遵循的实践宗教的检查NULL对于每个分配?将malloc return NULL虽然孤军过量使用的机制(我猜值1)?
事实上,安卓核使用的存储器过量使用(未确定价值,很想知道它(过量使用价值)及其意义).一些框架源(C/C++)代码在安卓(可能是第3个缔约方)没有检查空,也没有赶上bad_alloc后拨款。我失去了一些东西?
有一些线所以,关于过量使用的存储器,但他们都没解决我的混乱。
编辑: 如果侵略性的过量正在采用空不会返回(假设1).在没有物理存储器可用和在试图访问所分配的存储器(信分配的存储器),OOM会杀了一些过程和分配内存应用程序,直到它被死于把(假设2).在任何一种情况下我没有看到任何需要检定NULL(存储器中获取的分配或处理越来越杀)。我就在我的假设?
可携带性不是一个关心这个问题。
解决方案
是的,你还是应该检查故障,返回的 malloc
.在一个环境,overcommits的记忆你会不能够检测到和从中恢复的失败是由于环境中运行的物理存储所需的时你写的以部分地址的空间已经分配给你的程序,由以前的呼叫 malloc
.
然而,这不是唯一的问题,将会导致 malloc
失败在一个传统的环境。请求为特别大的方框内存在的地址空间的程序已变得支离破碎可能会失败,即使有可能是足够的总体记忆,以满足该请求。因为没有连续的范围内自由地址空间 malloc
必须失败。这种类型的失败必须发出信号通过 malloc
回 NULL
, 无论是否环境的过量使用的存储器。
其他提示
你必须检查返回的价值NULL 每 时间。任何图书馆功能失败。甚至fclose()do(在断开NFS分享,并从错误fclose NFS文件意味着,数据不是保存)。
大多数软件是严重的书面和不包含所有的检查。
malloc不能返回东西比其他空或指针。有或没有。你不能得到1byte从malloc如果你问的10.
它最好检查空宗教在所有功能的电话,可能返回NULL,无论是否与核有过罪可存储器或没有。
这下列代码段下面显示如何检查,如果电话来 malloc
工作或不...
void *ptr = malloc(10); if (ptr != NULL){ /* Do something here with ptr */ }else{ /* Do something here if it fails */ }
文件操作、存储器操作的名字,但一些将返回的一个空时的失败。
希望这会有所帮助, 最好的问候, 汤姆。
嗯...Linux由于记忆是不页的支持(最初)以及只有创建页面背后的第一读写的操作系统将总是成功得到你的存储器(除非你用尽的地址空间,什么不可能在64位系统)。所以,如果它运行的存储器和无法给你承诺的记忆,OOM凶手将会杀了你的申请或其他一些应用程序可以给你页支持你所需要的。所以无论你做NULL检查不出来是一样的,一个崩溃。......
没有,没有必要检查的结果malloc.
很久以前malloc会失败,操作系统已经遇到很多问题。
"OOM杀手和过量使用"将是一个更好的选择。
什么?你的操作系统并不支持"OOM杀手和过量使用"?
这就是为什么你应该开关于Linux(或安卓)!