Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Хороший пример использования этого атрибута – critical section в атмеловской либе для atmega/attiny.
__attribbute__(( cleanup(...) )) могут быть нюансы, связанные с повторным заходом в область видимости.int main(void)
{
{
struct Obj *test __attribute__(( cleanup(Obj_cleanup) )) = calloc(1, sizeof(struct Obj));
fprintf(stdout, "Obj allocated at %p\n", (void*)test);
fprintf(stdout, "Quitting the test scope...\n");
goto main__sub1;
main__exit:
return 0;
} // <-- Obj_cleanup is executed here twice, even though the control flow passes the 'test' definition only once
main__sub1:
fprintf(stdout, "The test scope has been quit.\n");
goto main__exit;
}Obj allocated at 00000000005F6880
Quitting the test scope…
Obj_cleanup() for 00000000005F6880
The test scope has been quit.
Obj_cleanup() for 00000000005F6880
test, и отказывается компилировать такой код.int *ptr_one = (int *)malloc(sizeof(int));
Например, при смене типа переменной (int * на long * — как вариант), если выполнить пункты выше — вся конструкция останется валидной. (А лучше, если здесь будет указатель на структурный объект.)
Если оставить как есть, то рано или поздно кто-нибудь да забудет исправить размер выделяемой памяти, а явное преобразование типа запретит умному компилятору выдать предупреждение об этом (так как явное преобразование — это «делай как я сказал» в Си).
Атрибут cleanup