c - 在 C 中处理错误和释放内存的正确方法

标签 c memory error-handling malloc

在某些函数中,我需要使用 malloc() 分配内存并有几个 if..else 语句,如伪代码所示:

allocate memory
if condition_1
    do_stuff
    if condition_2
        do_more_stuff
    else
        error
else
    error
free allocated memory
return

所以我一开始就分配内存,如果一切正常,它就会被释放。但目前错误功能仅打印错误消息并退出程序。但是正如我经常读到的那样,尽管当程序退出并且操作系统处理通常处理之后的释放时,不释放内存,但它不是好的风格。怎么偷懒把钱放出来?我是否必须编写一个错误函数,将每个指针都指向我分配的必须释放的内存,指针可能具有不同的数据类型?或者我应该在调用错误函数之前放置 free(ptr) 吗?一个错误函数,它接受一个数据类型为 void 的指针数组,并且比 all 释放更多,可以做到这一点吗?

最佳答案

我有两个解决方案。

您可以在调用freeerror 的地方放置一个标签:

void function(void)
{
    Memory *p = malloc(sizeof(*p));
    if (condition_1) {
        do_stuff();
        if (condition_2) {
            do_more_stuff();
        } else {
            goto err;
        }
    } else {
        goto err;
    }
    free(p);
    return;
err:
    free(p);
    error();
}

您还可以使用标志来标记错误:

void function(void)
{
    Memory *p = malloc(sizeof(*p));
    bool err = false;
    if (condition_1) {
        do_stuff();
        if (condition_2) {
            do_more_stuff();
        } else {
            err = true;
        }
    } else {
        err = true;
    }
    free(p);
    if (err)
        error();
}

我认为第二种解决方案在这种情况下看起来最好,但它们都同样有效。

关于c - 在 C 中处理错误和释放内存的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835150/

相关文章:

swift - 在使用 Alamofire 发出获取请求时,除了 `isSuccess` 之外,我还应该使用什么其他成员?

c - 为什么 OpenSSL 导致 sigpipe @ SSL_connect?

c - 如果应用程序在 lxc 容器中运行,则向 Netlink 发送消息失败并显示 ECONNREFUSED

r - 替代Linux中R的 `memory.size()`?

c - 在 C 中复制两个相邻字节的最快方法是什么?

go - 去处理所有返回的错误是惯用的吗?

c++ - 适用于 Windows 的 MinGW 编译器,使用 GCC、C99 与 GNU99

C 从特定字符打印字符串

内存映射 I/O 与端口映射 I/O

php - 在生产站点中删除laravel 4.1错误消息