Я пытаюсь написать функцию на C для решения математической задачи.В этой функции есть несколько шагов, и каждый шаг должен выделять некоторую память с размером, зависящим от результатов вычислений на предыдущих шагах (поэтому я не могу выделить их все в начале функции).Псевдокод выглядит так:
int func(){
int *p1, *p2, *p3, *p4;
...
p1 = malloc(...);
if(!p1){
return -1; //fail in step 1
}
...
p2 = malloc(...);
if(!p2){
free(p1);
return -2; //fail in step 2
}
...
p3 = malloc(...);
if(!p3){
free(p1);
free(p2);
return -3; //fail in step 3
}
...
p4 = malloc(...);
if(!p4){
free(p1);
free(p2);
free(p3); /* I have to write too many "free"s here! */
return -4; //fail in step 4
}
...
free(p1);
free(p2);
free(p3);
free(p4);
return 0; //normal exit
}
Описанный выше способ обработки сбоев malloc очень уродлив.Таким образом, я делаю это следующим образом:
int func(){
int *p1=NULL, *p2=NULL, *p3=NULL, *p4=NULL;
int retCode=0;
...
/* other "malloc"s and "if" blocks here */
...
p3 = malloc(...);
if(!p3){
retCode = -3; //fail in step 3
goto FREE_ALL_EXIT;
}
...
p4 = malloc(...);
if(!p4){
retCode = -4; //fail in step 4
goto FREE_ALL_EXIT;
}
...
FREE_ALL_EXIT:
free(p1);
free(p2);
free(p3);
free(p4);
return retCode; //normal exit
}
Хотя я считаю, что теперь это более кратко, ясно и красиво, но мой напарник по-прежнему категорически против использования 'goto'.И он предложил следующий метод:
int func(){
int *p1=NULL, *p2=NULL, *p3=NULL, *p4=NULL;
int retCode=0;
...
do{
/* other "malloc"s and "if" blocks here */
p4 = malloc(...);
if(!p4){
retCode = -4; //fail in step 4
break;
}
...
}while(0);
free(p1);
free(p2);
free(p3);
free(p4);
return retCode; //normal exit
}
Хммм, кажется, что можно избежать использования 'goto', но этот способ увеличивает отступы, что делает код уродливым.
Итак, мой вопрос: Есть ли какой-либо другой метод для обработки многих сбоев 'malloc' в хорошем стиле кода?Спасибо всем.