Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// деинициализация подсистемы
void subsystem_destroy(subsystem* self) {
filter2_destroy(&self->f2);
filter1_destroy(&self->f1);
free(self->buff_size2);
free(self->buff_size1);
self->buff_size2 = self->buff_size1 = NULL;
sema_destroy(&self->sema3);
sema_destroy(&self->sema2);
sema_destroy(&self->sema1);
self->sema3 = self->sema2 = self->sema1 = SEMA_INVALID_HANDLE;
}bool subsystem_construct(err_info* e); При этом под него выделяется память, а все внутренние поля инициализируются значением «неинициализировано». Т.е. указатели — в NULL, семафоры — в INVALID_HANDLE и т.п. А лишь затем — уже функцией subsystem_init. Соответственно, для этого объекта допустимо вызывать его «деструктор» где бы не прервался нормальный ход его инициализации.subsystem_init, subsystem_destroy, принимающие указатель на структуру subsystem — это же типичный ООП, просто на C.
Реализация exceptions на plain C