C如何处理malloc返回NULL?exit()或abort()

hel*_*hod 6 c

当malloc()失败时,哪个是处理错误的最佳方法?如果失败,我想立即退出程序,我通常会使用exit().但在这种特殊情况下,我不太确定exit()是否会成为这里的方式.

R..*_*R.. 13

在库代码中,除非调用者破坏了库的文档化界面的联系,否则调用exitabort在任何情况下都是绝对不可接受的.如果您正在编写库代码,则应该优雅地处理任何分配失败,释放在尝试操作中获取的任何内存或其他资源,并将错误条件返回给调用者.然后调用程序可以决定exit,abort,拒绝任何命令用户给这需要过多的内存,释放一些不需要的数据,然后再试一次,或任何有意义的应用.

在所有情况下,如果您的应用程序保存的数据尚未同步到磁盘并且对用户具有一些潜在价值,那么您应该尽一切努力确保不会丢弃有关分配失败的数据.用户几乎肯定会非常生气.最好设计你的应用程序,以便"保存"功能不需要任何分配,但如果你不能这样做,你可能会想要经常执行自动保存到临时文件操作或提供以不是标准文件格式(可能需要丑陋的XML和ZIP库,每个都有自己的分配需求,写入)的形式将内存内容转储到磁盘的方式,而是更多的"原始转储"


Luc*_*eis 5

如果malloc()返回NULL则表示分配不成功.由你来处理这个错误案例.由于分配失败,我个人觉得退出整个过程太过分了.以其他方式处理它.

  • 我认为这取决于应用程序.例如,如果您正在编写编辑,我会同意您的看法.您至少应该尝试将打开的文件保存到备份文件中.但是,如果无法分配足够的内存,则数字运算应用程序可能无法执行任何有用的操作.在这种情况下,记录有用的错误并退出可能是您可以做的最好的. (5认同)
  • 我可以想到很多数学应用程序可能会失败分配.例如,如果用户在具有任意精度算术的计算器中键入"print 3 !!!!!!!!!!!!!!!!"(`!`表示factorial).现在让它不仅仅是一个计算器,而是一个数字分析师的研究环境,并享受当有人在没有先保存他们的工作的情况下输入类似"只是为了好玩"的表达式而得到的hatemail,并且丢失一切.(PS如果您的应用程序基于GMP,那将会发生什么......) (2认同)