最近,我在Windows上的视频播放器程序的央视节目工作。 随着方案解码,并在同一时间播放多个视频流,我认为它可能满足的malloc会失败,我每次加的malloc后检查的情况。
但是genrally来说,开源项目的代码,这是我在开源项目读过,我很少发现的malloc结果的任何检查。 所以,当malloc的失败,大多数程序只会崩溃。 是不是unacceptalbe?
我的同事们谁写的Linux服务器程序将ALLOC 100个客户端连接一个足够的内存。 因此,尽管他的计划可能会拒绝该客户端101,它永远不会满足的malloc的失败。 是他的方法也适用于桌面应用程序?
在Linux上, malloc()
永远不会失败-相反,OOM杀手将被触发,并开始随意杀死进程,直到系统翻倒。 由于Linux是当今最流行的UNIX衍生,许多开发商已经学会了从来没有检查结果malloc()
这可能是为什么你的同事们忽略malloc()
失败。
在支持失败的操作系统,我已经看到了两个一般模式:
按照标准化的API
即使是在Linux上,的ulimit可以用来获得提示的malloc错误返回。 只是,它默认为无限。
有一定的压力,以符合公布的标准。 在大多数系统中,从长远来看,最后竟然在Linux上, malloc(3)
将返回失败的正确指示。 的确,桌面系统有虚拟内存和按需分页,但即使如此,没有检查malloc(3)
只能在一个调试的程序没有内存泄漏。 如果出现问题,会有人要设置ulimit
和追查。 突然, malloc
检查是有道理的。
要使用malloc的结果,而不检查null是在代码中可以开放使用的平台上,其中的malloc可能会失败,那些它往往会导致崩溃和无法预测的行为是不可接受的。 我不能预见未来,不知道在哪里我的代码会去,所以我会返回null写支票代码的malloc - 宁为玉碎比表现unpredicatbly!
策略如果失败的malloc取决于那种applciation和把握有多大,你对你所使用的图书馆做什么。 据某些情况下,唯一安全的事情就是停止整个程序。
预分配的内存的已知配额和一些大块瓜分了,所以敬而远之,实际上耗尽memeory的想法是好的,如果你的应用程序的内存使用情况是可预测,。 您可以扩展这个被你的代码编写您自己的内存管理程序使用。
这取决于应用程序,你正在使用的类型。 如果应用程序被分成其中一个单独的任务可以被允许失败的离散任务的工作,然后检查内存分配可以从正常恢复。
但在许多情况下,应对的唯一合理的方法,malloc失败是终止程序。 允许把你的代码崩溃就在所难免了空取消引用会实现这个目标。 它肯定永远是更好地转储日志条目或错误信息的解释错误,但在现实世界中,我们在有限的日程安排工作。 有时迂腐错误处理的投资回报率是不存在的。
经常检查,并预分配,可在这种情况下被释放,所以你可以提醒用户保存自己的数据和关闭应用程序的缓冲区。
要看你写的应用程序。 当然,你总是需要检查的malloc)的返回值(。 然而,处理OOM优雅不仅使在非常情况下,如低级别的关键系统服务,或写,可能是他们使用的库时的感觉。 有一个malloc的包装,在OOM中止是因此,在许多应用程序和框架非常普遍。 往往是那些包装命名的xmalloc()或类似。
GLib中的g_malloc()被中止了。
如果你要处理大量内存,并希望使报表到Linux就像“现在我有记忆区ABC,我不需要在B片,做你想”,看看到的mmap()/由madvise()系列库存GNU C库可用的功能。 根据您的使用模式,代码可以最终比使用malloc更简单。 这个API还可以用来帮助Linux的不通过缓存你要读文件浪费内存/只写一次。
他们是很好的记录在GNU libc中的信息文档。