В C++ деструкторы появились ещё в 1985 году. А C-разработчики десятилетиями продолжали писать ручной cleanup через
goto, free, fclose и аккуратные прыжки в конец функции.Но у GCC уже давно есть почти RAII-подобный механизм:
__attribute__((cleanup))Он вызывает указанную функцию автоматически, когда переменная выходит из области видимости. Причём срабатывает не только в конце функции, но и при раннем
return.Пример:
__attribute__((cleanup(fclosep))) FILE *f = fopen(path, "r");
__attribute__((cleanup(freep))) char *buf = malloc(4096);
if (!f || !buf)
return -1;
После выхода из функции fclose и free вызовутся автоматически.
Эту технику используют в проектах вроде libvirt и QEMU, а в Linux kernel похожий подход начали активно принимать с 2023 года.
C всё ещё остаётся C, но иногда в нём внезапно появляются фичи, из-за которых старый goto cleanup выглядит как археология.
