Erros e EXIT_FAILURE

Re: Erros e EXIT_FAILURE

por Francisco Reverbel -
Número de respostas: 0
Em geral você pode supor que os dados de entrada estão corretos. Se alguma coisa for muito fácil de verificar, então pode valer a pena fazer a verificação. Exemplo: Quando você olhar para o argv[1] (o primeiro argumento do programa, que especifica o algoritmo) para ver se ele é "1", "2" ou "3", não custa (quase) nada apresentar uma mensagem de erro se ele contiver outra coisa qualquer. Outras verificações podem ser omitidas. Exemplos: Pode passar diretamente para fopen os nomes de arquivo em argv[2], argv[3] e argv[4] , sem verificar se algum usuário sacana especificou nomes iguais para os arquivo de entrada e de saída, pode ignorar qualquer argv[i] com i>4, etc.

No final da execução do programa (em consequencia de uma chamada exit(EXIT_FAILURE) ou por outro motivo qualquer, como por exemplo um comando return na função main) toda a memória alocada por chamadas a malloc é liberada e todos os arquivos abertos por chamadas a fopen são fechados. Em outras palavras, o exit implicitamente faz todos os frees e fcloses que forem necessários.

Nos casos em que o programa acaba de modo anormal (porque malloc devolveu NULL, ou porque fopen não conseguiu abrir algum arquivo), use o fato que o exit já toma as providências finais que têm de ser tomadas. Seria muito chato rastrear todas as pendências para dar frees e fcloses antes de cada chamada exit(EXIT_FAILURE) (dentro de mallocx, por exemplo).

No caso do programa acabar normalmente, faça com que ele execute explicitamente todos os frees e fcloses antes de encerrar a execução. A rigor isso não é necessário, mas é bom para gente não esquecer que free e fclose existem...