Лично; У меня есть библиотека отслеживания ресурсов (в основном сбалансированное двоичное дерево), и у меня есть оболочки для всех функций выделения.
Ресурсы (такие как память, сокеты, дескрипторы файлов, семафоры и т. Д. - все, что вы выделяете и освобождаете) могут принадлежать к набору.
У меня также есть библиотека обработки ошибок, в которой первый аргумент каждой функции является набором ошибок, и если что-то идет не так, функция, в которой произошла ошибка, передает ошибку в набор ошибок.
Если набор ошибок содержит ошибку, функции не выполняются . (У меня есть макрос в верхней части каждой функции, который заставляет ее возвращаться).
Итак, несколько malloc выглядят так:
mem[0] = malloc_wrapper( error_set, resource_set, 100 );
mem[1] = malloc_wrapper( error_set, resource_set, 50 );
mem[2] = malloc_wrapper( error_set, resource_set, 20 );
Нет необходимости проверять возвращаемое значение, потому что в случае ошибки никакие следующие функции не будут выполняться , например, Следующие мальлоки никогда не встречаются.
Итак, когда мне приходит время освободить ресурсы (скажем, в конце функции, где все ресурсы, используемые этой функцией внутри, были помещены в набор), я освобождаю набор. Это всего лишь один вызов функции.
res_delete_set( resource_set );
Мне не нужно специально проверять ошибки - в моем коде нет if (), проверяющих возвращаемые значения, что делает его поддерживаемым; Я считаю, что профилирование встроенной проверки ошибок нарушает читабельность и, следовательно, удобство обслуживания. У меня просто хороший список вызовов функций.
Это art , мужчина: -)