C如何处理malloc返回NULL?退出()或中止()

C如何处理malloc返回NULL?退出()或中止(),c,C,当malloc()失败时,处理错误的最佳方法是什么?如果失败,我想立即退出程序,这通常是使用exit()完成的。但是在这种特殊情况下,我不太确定exit()是否是解决这个问题的方法。两者都使用吗? 这取决于核心文件是否有用。如果没有人要分析它,那么您也可以简单地退出(2)或退出(3) 如果该程序有时在本地使用,并且您打算分析生成的任何核心文件,那么这就是使用abort(3)的理由 您总是可以有条件地选择,因此,使用--debug使用中止(3),而不使用exit。如果malloc()返回NULL

当malloc()失败时,处理错误的最佳方法是什么?如果失败,我想立即退出程序,这通常是使用exit()完成的。但是在这种特殊情况下,我不太确定exit()是否是解决这个问题的方法。

两者都使用吗?
这取决于核心文件是否有用。如果没有人要分析它,那么您也可以简单地退出(2)或退出(3)

如果该程序有时在本地使用,并且您打算分析生成的任何核心文件,那么这就是使用
abort(3)
的理由


您总是可以有条件地选择,因此,使用
--debug
使用
中止(3)
,而不使用exit。

如果
malloc()
返回
NULL
,则表示分配不成功。由你来处理这个错误案例。我个人认为由于分配失败而退出整个过程是过分的。用另一种方式处理它

在库代码中,在任何情况下调用
exit
abort
都是绝对不可接受的,除非调用方中断了与库的文档界面的联系。如果您正在编写库代码,您应该优雅地处理任何分配失败,释放在尝试的操作中获得的任何内存或其他资源,并向调用者返回错误条件。然后,调用程序可能决定退出、中止、拒绝用户发出的任何需要过多内存的命令、释放一些不需要的数据并重试,或者对应用程序有意义的任何命令


在所有情况下,如果应用程序保存的数据尚未同步到磁盘,并且对用户有潜在价值,则应尽一切努力确保不会在分配失败时丢弃这些数据。用户几乎肯定会非常生气。最好设计应用程序,使“保存”功能不需要任何分配,但如果通常不能这样做,您可能希望执行频繁的自动保存到临时文件操作,或者提供一种将内存内容以非标准文件格式的形式转储到磁盘的方法(例如,这可能需要编写丑陋的XML和ZIP库,每个库都有自己的分配需要),但需要更“原始转储”下一次启动时,应用程序可以读取并从中恢复。

可能的副本我认为这取决于应用程序。例如,如果您正在编写编辑器,我会同意您的看法。您至少应该尝试保存打开的文件,可能是备份文件。但是,数字处理应用程序可能无法使用如果无法分配足够的内存,则可能会出错。在这种情况下,记录一个有用的错误并退出可能是您能做的最好的方法。实际上,这取决于应用程序。一个简单的媒体播放器(没有任何音乐下载/购买/播放列表/库功能)在分配失败时退出是完全合理的。但是退出的文字处理器或web浏览器(可能会丢失用户的研究论文、部分撰写的博客文章/评论、电子邮件等)会引起用户的极大愤怒。此外,现代应用程序什么时候分配失败?只有当系统疯狂运行且系统中没有内存或交换空间时(想象一下内存泄漏的叉形炸弹)。因此,在这种情况下,以尽可能快的速度使程序崩溃并不是一个坏主意。我可以想到很多可能分配失败的数学应用程序。例如,如果用户键入
print 3!!!!!!!!!!!!!!!!!
表示阶乘)在一个具有任意精度算术的计算器中。现在,让它不仅仅是一个计算器,而是一个数字分析师的研究环境,当有人输入这样一个“只是为了好玩”的表达式而没有首先保存他们的工作,并且丢失了所有内容时,享受你收到的电子邮件。(注意,如果你的应用程序是基于GMP的,那正是会发生的事情…)建议不要使用
\u exit()
,因为这意味着使用
atexit()注册的清理函数
不会运行……如果用户耗尽了所有可用的系统内存和交换空间,他们就很难对硬件故障感到愤怒。这就像在电源故障时责怪应用程序程序员。一个健壮的系统在电源故障时给你足够的时间节省。即使它只是一台笔记本电脑,如果它不是垃圾,你也应该有4-10个小时...