最近,我的工作的视频播放器程序,在Windows为一个中央电视台的节目。作为该计划已经解码和发挥多的视频流的同时,我认为这可能满足的情况下,malloc将失败,并且我检查后每malloc.

但genrally讲,在这些代码的开放源码程序,我已经读了在开放源项目,我很少发现任何检查的结果malloc.所以当malloc失败,最程序会只是崩溃。是不是unacceptalbe?

我的同事写入服务器的计划在linux上将分配足够的存储器,用于100个客户连接。所以尽管他的程序可能会拒绝101客户,它将永远不会遇见了一个失败的malloc.是他的做法也适用于桌面应用程序?

有帮助吗?

解决方案

在Linux上 malloc() 将永远不会失败--而不是,OOM凶手将被触发,并开始杀戮随机的进程,直到系统落。因为Linux是最受欢迎的UNIX衍生物使用的今天,许多开发人员已经学会了只是从来没有检查结果 malloc().也许这就是为什么你的同事们忽略 malloc() 失败。

在操作系统,支持失败,我看到两个一般的模式:

  • 编写定制的程序,检查的结果 malloc(), 和呼叫 abort() 如果分配失败。例如, 巧舌如簧和GTK+ 图书馆使用这种方法。

  • 商店一个全球性的清单的"清除可能"拨款,例如缓存,其中可以清除事件的分配失败。然后,尝试分配再次,如果它仍然失败,报告它通过标准的错误报告的机制(其没有执行动态分配)。

其他提示

按照标准化API

即使在Linux,的ulimit可以用来得到一个提示的malloc的错误返回。只是,它默认为无限制。

有一个明确的压力以符合公布的标准。在大多数系统中,从长远来看,最后竟然在Linux上, malloc(3) 会返回失败的正确指示。这是事实,桌面系统具有虚拟存储器和需求寻呼,但即使如此,没有检查 ulimit 只能在没有内存泄漏调试的程序。如果出现问题,会有人想设置一个 malloc 和追查。突然,<=>检查是有意义的。

要使用malloc的结果,而不检查空是在代码可能是打开使用的平台上,其中的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库信息的文档。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top