【C语言】用goto管理多个malloc异常处理

文章介绍了一种在C语言程序中通过使用`goto`解决多个`malloc`可能出现内存分配失败后内存清理问题的方法,避免了冗余代码,提高可维护性。
摘要由CSDN通过智能技术生成

如果程序中存在多个顺序申请空间的malloc,如果对之后malloc的内存进行检查后出错,则需要在return前将此前所有的malloc都free掉。通常的if+return的处理会在存在过多malloc时出现过多重复代码。参考StackExchange给出一个基于goto的解决方案:

#include <stdio.h>
#include <stdlib.h>

#define MALLOC_GOTO(p, n)  \
    malloc(sizeof *(p)*n); \
    if ((p) == NULL) goto malloc_failed_##p

int main()
{
    int *arr0 = malloc(sizeof *arr0 * 10);
    // int *arr0 = NULL;
    if (arr0 == NULL) {
        goto malloc_failed_arr0;
    }
    double *arr1 = malloc(sizeof *arr1 * 10);
    // double *arr1 = NULL;
    if (arr1 == NULL) {
        goto malloc_failed_arr1;
    }
    char *arr2 = malloc(sizeof *arr2 * 10);
    // char *arr2 = NULL;
    if (arr2 == NULL) {
        goto malloc_failed_arr2;
    }
    float *arr3 = malloc(sizeof *arr3 * 10);
    // float *arr3 = NULL;
    if (arr3 == NULL) {
        goto malloc_failed_arr3;
    }
    // use macro if you like
    float *arr4 = MALLOC_GOTO(arr4, 200);
    float *arr5 = MALLOC_GOTO(arr5, 200);
    float *arr6 = MALLOC_GOTO(arr6, 200);

    /* after some uses... */
    //..

    /* finally return */
    printf("free(arr0)\n");
    free(arr0);
    printf("free(arr1)\n");
    free(arr1);
    printf("free(arr2)\n");
    free(arr2);
    printf("free(arr3)\n");
    free(arr3);
    printf("free(arr4)\n");
    free(arr4);
    printf("free(arr5)\n");
    free(arr5);
    printf("free(arr6)\n");
    free(arr6);
    printf("return 0\n");
    return 0;

    /* deal with malloc failed */
malloc_failed_arr6:
    printf("free(arr6)\n");
    free(arr6);
malloc_failed_arr5:
    printf("free(arr4)\n");
    free(arr4);
malloc_failed_arr4:
    printf("free(arr3)\n");
    free(arr3);
malloc_failed_arr3:
    printf("free(arr2)\n");
    free(arr2);
malloc_failed_arr2:
    printf("free(arr1)\n");
    free(arr1);
malloc_failed_arr1:
    printf("free(arr0)\n");
    free(arr0);
malloc_failed_arr0:
    printf("return -1\n");

    return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值