すがブロ

sugamasaoのhatenablogだよ

C言語のエラー処理

どうやれば美しくなるのか

例えば、こんなソース

  1 #include <stdio.h> 
  2 #include <stdlib.h>
  3 
  4 int hoge(void) {
  5     char* list1;
  6     char* list2;
  7     int returnCode = 0;
  8 
  9     list1 = malloc(sizeof(char)*10);
 10     if (list1 == NULL) {
 11         puts("><");
 12         return 1;
 13     }
 14 
 15     list2 = malloc(sizeof(char)*10);
 16     if (list2 == NULL) {
 17         puts("><");
 18         free(list1);
 19         return 1;
 20     }
 21 
 22 // なんかすごい処理をする
 23 
 24     free(list1);
 25     free(list2);
 26     return 0;
 27 }
 28 
 29 int main(void) {
 30     if (hoge() == 1) {
 31         puts("エラーだよ><");
 32         exit(1);
 33     }
 34 
 35     return 0;
 36 }

ここの hoge 関数では、処理中でメモリ確保を行っているけど、”関数終了の時点でメモリの解放をしたい”という用件の時どうする。
愚直に書くと上記のようなコードになるかと思うのだけど、これはダサい。これはひどい。
こんなコピペ的ソースを書くのは精神衛生上良くない。
一体どうしたら良いのか/(^o^)\

後ろ向きな解決策1

goto 文を使う。逆に、ここで使わなければ一生使い道がないかもしれない。
とはいえ、あまり使いたいとも思わないのでできればやりたくない。

後ろ向きな解決策2

無視する。基本的にプログラムが終了すればプログラムに割り当てられているメモリ領域は解放されるのだから、あえて free しないのも手。
もちろん、単発・短時間しか動かないプログムでしか使える局面がないと思うけど。

というわけで

普通に長時間・何サイクルも動作するようなプログラムやデーモン系はどうやってエラーハンドリングするのか。スタンダードなやり方を知らないせいか、すげぇきもちわるいよ><
おしえてエロイひと!><