Здравствуйте. Недавно, читая чужой код, наткнулся на такую вещь: человек, натолкнувшись на ошибку в программе, которая в рантайме не правится (память не выделилась, файл не открылся...) выдаёт ошибку и выходит по exit(EXIT_FAILURE). Я то, как умная Маша, пробегался по выделенной ранее памяти, освобождал её, закрывал все открытые файлы, выходил на уровень выше (по дереву вызовов) return`ом с возвращением кода ошибки - там та же фигня и т.д.... Я был в корне не прав? На сколько я понимаю, при вызове exit() освобождается вся выделенная программе память и закрываются файловые потоки, Но так как делал я, мне как-то спокойнее было :)) (паранойя?) Может кто-нибудь может назвать причины, почему стоит делать именно так, как делал я? :)
Ещё интересно - пользуется ли кто-то at_exit() - для регистрации деструкторов, скажем для структур, которые перед смертью не то, чтобы память освободить должны (она, видимо, и так освобождается), а там сделать чего-то нужное,
И ещё вопрос - зачем делать:
my_type_t * var;
var = (my_type_t *) malloc (sizeof(my_type_t));
Когда можно:
var = malloc (sizeof(*var));
- Преобразование типа перед возвратом malloc имеет какое-то сакральное значение (подозреваю - для совместимости с C++)
- Указывать размер по типу а не по переменной под которую выделяешь память как-то не очеь удобно... ну может там тип поменяться... или тут тоже скрытый смысл?
Встречал также
ioctl (fd, MY_CONTROL_COMMAND, (int)&my_var).
Здесь-то к чему эти преобразования???