Прежде всего, если кто-то может изменить вопрос, чтобы сделать его более понятным, сделайте.Каковы некоторые хорошие способы обработки ошибок (очистка и прерывание) в функции, которая инициализирует несколько ресурсов в C?
Обычное явление в программировании на С имеет несколько ресурсов, которые должны быть инициализированы/выделены в определенном порядке. Каждый ресурс является предварительным условием для инициализации последующих. Если один из шагов не выполняется, оставшиеся ресурсы предыдущих шагов должны быть де-распределены. Идеально псевдокод (с использованием функции волшебно родовое чисто унобтаиниум clean_up_and_abort()) будет выглядеть примерно следующим образом:
err=alloc_a()
if(err)
clean_up_and_abort()
err=alloc_b()
if(err)
clean_up_and_abort()
err=alloc_c()
if(err)
clean_up_and_abort()
// ...
profit()
Я видел несколько способов обработки этого, все они, кажется, имеют существенные недостатки, по крайней мере, с точки зрения от того, что люди склонны считать «хорошей практикой».
Каковы наиболее читаемые и наиболее подверженные ошибкам способы структурирования кода при обработке этой ситуации? Эффективность предпочтительнее, но разумное количество эффективности может быть принесено в жертву ради удобочитаемости. Перечислите преимущества и недостатки. Ответы на обсуждение нескольких методов приветствуются.
Цель состоит в том, чтобы надеяться, в конечном итоге, с набором нескольких предпочтительных методов решения этой проблемы.
Начну с некоторых методов, которые я уже видел, прокомментируйте их и добавьте другие.
За отличную статью/учебник по неполным типам данных, инкапсуляцию, скрытие данных, динамическую связь/позднюю привязку и объектно-ориентированные подходы к динамическим структурам данных, см. [** Объектно-ориентированное программирование в ANSI-C **] (http://www.cs.rit.edu/~ats/books/ooc.pdf). Хотя это написано и требует достаточно глубоких знаний о C, это стоит усилий, чтобы усвоить материал. Он охватывает ряд тем, не включенных в большинство книг или учебников C. –
благодарим вас за ввод! Ключевой идеей для них обоих является создание общей функции очистки, которая проверяет, был ли выделен каждый ресурс, о чем я не думал. Все эти разговоры о ООП в C напоминают мне о большой статье, которую я прочитал о внедрении исключений в C: http://www.on-time.com/ddj0011.htm. Выглядит красиво. Похоже, это удобный инструмент для разумно сложных встроенных проектов, но я не был достаточно храбр, чтобы еще попробовать его. – Dmitri