emoji C тоже умеет автоматическую очистку ресурсов. Просто почти никто об этом не знает

В C нет RAII как в C++ и нет defer как в Go. Поэтому код с ресурсами часто превращается в набор goto cleanup, ручных free() и риска забыть освободить память на одной из веток.

Но у GCC и Clang есть полезное расширение - __attribute__((cleanup)).

Оно позволяет повесить cleanup-функцию на локальную переменную. Когда переменная выходит из scope, компилятор сам вызывает эту функцию.

Пример:


void autofree(void *p) {
free(*(void **)p);
}

#define auto __attribute__((cleanup(autofree)))

int main() {
auto char *buf = malloc(1024);

// buf будет автоматически освобождён
// при выходе из scope

return 0;
}



Это просто автоматический вызов cleanup-функции в конце области видимости.

Почему это удобно:

• меньше ручных free()
• меньше утечек на early return
• чище код с несколькими ресурсами
• проще писать функции без огромного cleanup: блока

Но есть важный нюанс: это не стандартный C, а расширение компилятора. В portable-коде так лучше не делать, а вот в системном коде под GCC/Clang - вполне рабочий инструмент.

C не стал безопасным языком от одной такой фичи. Но иногда он умеет больше, чем от него ожидают.
👍 16
🔥 8
5
1 44 1.8K

Обсуждение 1

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram