TGViewer
Библиотека С# С++ Библиотека С# С++ @cpluscsharp · 10.1K subscribers
Post #545 1.83K
Как сделать defer в C через cleanup-паттерн

В Go есть `defer`. В C - нет. Но это не значит, что нельзя получить тот же эффект.

Главная проблема в C - ресурсы:
- забыли закрыть файл
- не освободили память
- не закрыли сокет
- утечки и баги в error-path

Хитрый приём - использовать единый блок очистки через `goto cleanup`. Это самый надёжный способ имитировать defer в C.

Идея:
- ресурсы выделяются по шагам
- при ошибке — переход в cleanup
- в конце — освобождаем всё в одном месте

Так код становится безопаснее и проще для поддержки.

Пример:


#include <stdio.h>
#include <stdlib.h>

int process_file(const char* path) {
FILE* file = NULL;
char* buffer = NULL;
int result = -1;

file = fopen(path, "r");
if (!file) goto cleanup;

buffer = malloc(1024);
if (!buffer) goto cleanup;

// работа с файлом
fread(buffer, 1, 1024, file);

result = 0; // успех

cleanup:
if (buffer) free(buffer);
if (file) fclose(file);
return result;
}

Почему это хороший паттерн:
- нет дублирования освобождения ресурсов
- все error-path’ы безопасны
- легко добавлять новые ресурсы
- стандартная практика в системном C (ядро Linux использует тот же подход)

Главная идея: в C «defer» — это дисциплина структуры кода.

https://antonz.org/defer-in-c/
  • ❤ 4
  • 👍 3
More from @cpluscsharp
  1. Sep 14, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 15 сентября(уже завтра!) в 1…
  2. Sep 13, 2026💡 C++: std::map<std::string, ...> не обязан создавать временный std::string при каждом по…
  3. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  4. Sep 9, 2026🖥 C++: объект уничтожен, а 16 МиБ всё ещё заняты std::weak_ptr может удерживать память да…
  5. Sep 2, 2026C++26 получил новый контейнер `std::hive` - что-то между `std::vector` и `std::list`. Глав…
  6. Aug 23, 2026Бесплатная книга, после которой компиляторы перестают казаться магией По ходу книги вы соб…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →