如果程序中存在多个顺序申请空间的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;
}