Сдается мне, что cleanup_3
должен выполнить очистку, а затем вызвать cleanup_2
. Точно так же cleanup_2
должен выполнить очистку, затем вызвать cleanup_1. Похоже, что в любое время, когда вы делаете cleanup_[n]
, требуется cleanup_[n-1]
, поэтому ответственность за метод должна лежать на нем (так что, например, cleanup_3
никогда не может быть вызван без вызова cleanup_2
и возможной утечки) .)
При таком подходе вместо gotos вы просто вызываете процедуру очистки, а затем возвращаете.
Подход goto
не является неправильным или плохим , однако, просто стоит отметить, что это не обязательно самый «чистый» подход (ИМХО).
Если вы ищете оптимальную производительность, то я думаю, что решение goto
является лучшим. Однако я ожидаю, что это будет уместно только в некоторых приложениях, критичных к производительности (например, драйверы устройств, встроенные устройства и т. Д.). В противном случае это микрооптимизация, которая имеет более низкий приоритет, чем четкость кода.