Como posso lidar corretamente com a falha de malloc em C, especialmente quando há mais de um malloc?

Suponha que isso faça parte do meu código:

 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);  
 }

Como é possível que o primeiromalloc é bem sucedido, mas o segundo falha, eu usofree(p) no segundo "manipulador de erros". Mas e se houver maismalloce se eu quiser modificar o código (ajustando seus pedidos, adicionando ou excluindo algunsmalloc)?

Eu sei que em C ++ existem coisas como RAII e exceção segura, etc. Mas, em geral, qual é a maneira correta de lidarmalloc falha em C? (talvez usando algunsgoto?)

questionAnswers(6)

yourAnswerToTheQuestion