TC>еще один вариант — "липовый" do {}while(0);
TC>плюсы :
TC> + в любом месте можно выйти из него простым break не заботясь о вызове деструкторов
TC> + все деструкторы вызываются в одном месте
TC> + несмотря на похожесть на вариант с goto тут нет меток
TC> + внутри do {} while() можно завести какой локальный объект внутри тела блока.
TC> минусы :
TC> — кому то может показаться что do {} while() используется не по делу)
TC> — код все таки уползает вправо хотя и медленно.
TC> — проверки на NULL режут глаз
для устранения минуса №3 можно воспользоваться следующей техникой:
int f()
{
int stage, failed;
void *obj1;
void *obj2;
for( stage = 0;; ) {
if( !(failed=construct_obj1(&obj1)) )
break;
++stage;
if( !(failed=construct_obj2(&obj2)) )
break;
++stage;
if( !(failed=do_something(obj1,obj2)) )
break;
++stage;
break;
}
switch( stage ) {
case 3: break;
case 2: destruct_obj2(obj1);
case 1: destruct_obj1(obj1);
}
return failed;
}
плюсы:
+ красиво

+ мы не обязаны инициализировать указатели на создаваемые объекты
минусы:
— нужна специальная переменная stage
— отслеживание значений переменной stage в каждой точке инициализации