代码之家  ›  专栏  ›  技术社区  ›  helpermethod

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

c
  •  6
  • helpermethod  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  13
  •   R.. GitHub STOP HELPING ICE    15 年前

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

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

        2
  •  5
  •   Luca Matteis    15 年前

    如果 malloc() 退货 NULL 这意味着分配失败。这取决于你如何处理这个错误案例。我个人认为退出整个流程是过度的,因为分配失败。换个方式处理。

        3
  •  1
  •   DigitalRoss    15 年前

    两者都用?


    这取决于核心文件是否有用。如果没有人分析它,那么你也可以简单地 _exit(2) exit(3) .

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

    你可以有条件地选择,所以 --debug 使用 中止(3) 如果没有它,使用出口。