コードを非常に防御的に記述し、呼び出すすべての関数からの戻り値を常にチェックするとします。
だから私は次のようになります:
char* function() {
char* mem = get_memory(100); // first allocation
if (!mem) return NULL;
struct binder* b = get_binder('regular binder'); // second allocation
if (!b) {
free(mem);
return NULL;
}
struct file* f = mk_file(); // third allocation
if (!f) {
free(mem);
free_binder(b);
return NULL;
}
// ...
}
free()
物事がいかに早く制御不能になるかに注目してください。一部の関数が失敗した場合は、前にすべての割り当てを解放する必要があります。コードはすぐに醜くなり、私がすることはすべてをコピーして貼り付けることだけです。私はコピー/貼り付けプログラマーになります。さらに悪いことに、誰かがその間にステートメントを追加した場合、彼はfree()
追加を呼び出すために以下のすべてのコードを変更する必要があります。
経験豊富なCプログラマーはこの問題にどのように取り組んでいますか?何もわからない。
ありがとう、BodaCydo。