Предположим, что я очень хорошо пишу свой код и всегда проверяю возвращаемые типы из всех функций, которые я называю.
Итак, я люблю:
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 справляются с этой проблемой? Я ничего не могу понять.
Спасибо, Бода Сидо.