我如何正确处理C中的malloc失败,尤其是当有多个malloc时?

鲁恩

假设这是我的代码的一部分:

 int foo()
 {  
    char *p, *q ;
    if((p = malloc(BUFSIZ)) == NULL) {
        return ERROR_CODE;
    }
    if((q = malloc(BUFSIZ)) == NULL) {
        free(p)
        return ERROR_CODE;
    }
    /* Do some other work... */

    free(p);
    free(q);  
 }

由于第一个可能malloc成功而第二个失败,所以我free(p)在第二个“错误处理程序”中使用。但是,如果还有更多malloc?我想修改代码(调整其顺序,添加或删除一些内容malloc)怎么办?

我知道在C ++中有诸如RAII和异常安全之类的东西。但是,总的来说,处理mallocC失败的正确方法是什么(也许使用一些goto?)

bl

您的代码很好,但是对于很多变量,我希望:

int
foo()
{
    char *p = NULL;
    char *q = NULL;
    int ret = 0;

    if (NULL == (p = malloc(BUFSIZ)))
    {
        ret = ERROR_CODE;
        goto error;
    }

    // possibly do something here

    if (NULL == (q = malloc(BUFSIZ)))
    {
        ret = ERROR_CODE;
        goto error;
    }

    // insert similar repetitions

    // hopefully do something here

  error:
    free (p);
    free (q);
    return ret;
}

请注意,释放NULL被定义为无操作。

这避免nn变量的缩进级别您可以类似地清理文件句柄等(尽管您必须在周围加上一个条件close())。

现在,如果您知道可以一次分配它们,那么dasblinkenlight有一个很好的答案,但是这是另一种方式:

int
foo()
{
    int ret = 0;
    char *p = malloc(BUFSIZ);
    char *q = malloc(BUFSIZ);
    char *r = malloc(BUFSIZ);
    if (!p || !q || !r)
    {
        ret = ERROR_CODE;
        goto exit;
    }

    // do something

  exit:
    free(p);
    free(q);
    free(r);
    return ret;
}

最终可能性:如果您确实想在malloc失败时退出程序,请考虑使用malloptM_CHECK_ACTION选项。这样可以malloc()检查故障,并调用abort(),并可能显示有用的消息。

从手册页:

姓名

mallopt -设置内存分配参数

概要

  #include <malloc.h>

  int mallopt(int param, int value);

描述

mallopt()函数调整控制内存分配函数行为的参数(请参阅参考资料malloc(3))。param参数指定要修改的参数,并value指定该参数的新值。

可以为以下值指定param

M_CHECK_ACTION

设置此参数可控制在检测到各种编程错误(例如,释放同一指针两次)时glibc的响应方式。分配给该参数的值的3个最低有效位(2、1,和0)确定glibc行为,如下所示:

位0:如果设置了此位,则在其上打印一条单行消息,stderr其中提供有关错误的详细信息。该消息以字符串开头"*** glibc detected ***",后跟程序名称,检测到错误的内存分配函数的名称,错误的简要说明以及检测到错误的内存地址。

位1:如果设置了此位,则在打印由位0指定的任何错误消息之后,通过调用终止程序abort(3)在从2.4开始的glibc版本中,如果还设置了位0,则在打印错误消息和中止之间,程序还将以方式打印堆栈跟踪,并以方式backtrace(3)打印进程的内存映射/proc/[pid]/maps(请参阅参考资料proc(5))。

位2:(自glibc 2.4起)仅当还设置了位0时,此位才有效。如果设置了此位,则描述错误的单行消息将简化为仅包含检测到错误的函数的名称以及错误的简短描述。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中处理文件时如何正确处理异常

来自分类Dev

如何在没有Joda Time的Java 7中正确处理夏令时?

来自分类Dev

如何正确处理我的servlet中的异常

来自分类Dev

如何正确处理多个 if else 条件?

来自分类Dev

如何处理malloc失败并返回NULL?

来自分类Dev

我如何正确处理此承诺?

来自分类Dev

如何调用可能会失败的构造函数,尤其是在实现“读取”和“任意”时?

来自分类Dev

如何使DOT正确处理UTF-8到PostScript并具有多个图形/页面?

来自分类Dev

如何处理Java编码问题(尤其是xml)?

来自分类Dev

JSF组件中的按键处理,尤其是<p:tree>

来自分类Dev

如何在C中正确使用malloc?

来自分类Dev

如何正确处理 ASP.Net Core 3 Web API 中的多个端点

来自分类Dev

从网站下载多个文件,如何正确处理ctrl + c

来自分类Dev

QT-如何正确处理Vsync和多个QGLWidgets

来自分类Dev

如何正确处理多个运行时错误?

来自分类Dev

如何正确处理多个特权MySQL连接帐户

来自分类Dev

如何使用 JSTL 检查 JSP 中的请求参数,尤其是 <c:set> 标签?

来自分类Dev

我可以在失败时循环使用malloc吗?

来自分类Dev

从Roslyn工作区发出时如何正确处理资源?

来自分类Dev

使用StreamContent时如何正确处理流

来自分类Dev

关闭控制台时如何正确处理SIGBREAK?

来自分类Dev

使用 poll() 时正确处理 Ctrl-C

来自分类Dev

如何正确处理httpClient?

来自分类Dev

如何正确处理scanf()

来自分类Dev

如何正确处理并发?

来自分类Dev

如何正确处理导航

来自分类Dev

如何正确处理和打印bash中带有空格的文件

来自分类Dev

jgroup可以告知我们有关节点状态的信息吗(尤其是当节点出局时)

来自分类Dev

R:如何在函数中添加参数(尤其是“ ...”)?

Related 相关文章

  1. 1

    在C#中处理文件时如何正确处理异常

  2. 2

    如何在没有Joda Time的Java 7中正确处理夏令时?

  3. 3

    如何正确处理我的servlet中的异常

  4. 4

    如何正确处理多个 if else 条件?

  5. 5

    如何处理malloc失败并返回NULL?

  6. 6

    我如何正确处理此承诺?

  7. 7

    如何调用可能会失败的构造函数,尤其是在实现“读取”和“任意”时?

  8. 8

    如何使DOT正确处理UTF-8到PostScript并具有多个图形/页面?

  9. 9

    如何处理Java编码问题(尤其是xml)?

  10. 10

    JSF组件中的按键处理,尤其是<p:tree>

  11. 11

    如何在C中正确使用malloc?

  12. 12

    如何正确处理 ASP.Net Core 3 Web API 中的多个端点

  13. 13

    从网站下载多个文件,如何正确处理ctrl + c

  14. 14

    QT-如何正确处理Vsync和多个QGLWidgets

  15. 15

    如何正确处理多个运行时错误?

  16. 16

    如何正确处理多个特权MySQL连接帐户

  17. 17

    如何使用 JSTL 检查 JSP 中的请求参数,尤其是 <c:set> 标签?

  18. 18

    我可以在失败时循环使用malloc吗?

  19. 19

    从Roslyn工作区发出时如何正确处理资源?

  20. 20

    使用StreamContent时如何正确处理流

  21. 21

    关闭控制台时如何正确处理SIGBREAK?

  22. 22

    使用 poll() 时正确处理 Ctrl-C

  23. 23

    如何正确处理httpClient?

  24. 24

    如何正确处理scanf()

  25. 25

    如何正确处理并发?

  26. 26

    如何正确处理导航

  27. 27

    如何正确处理和打印bash中带有空格的文件

  28. 28

    jgroup可以告知我们有关节点状态的信息吗(尤其是当节点出局时)

  29. 29

    R:如何在函数中添加参数(尤其是“ ...”)?

热门标签

归档