Лично я бы вообще отказался от этого подхода, так как мне кажется, что он слишком близок к неопределенному поведению, и он может вызвать проблемы, либо когда вы переходите на другой компилятор / платформу, либо просто когда вы путаете обслуживание программисты.
Почему бы просто не объявить переменные в начале области?
Все равно выглядит аккуратнее для моих глаз.
int main()
{
void * ptr1 = NULL;
void * ptr2 = NULL;
int ret = 0;
if (ret = do_ptr_work(ptr1))
goto done;
if (ret = do_ptr_work(ptr2))
goto done;
done:
if (ptr1) {
free(ptr1);
ptr1 = NULL;
}
if (ptr2) {
free(ptr2);
ptr2 = NULL;
}
return ret;
}
Или даже просто полностью изменить рефакторинг для удаления goto?
int main()
{
void * ptr1 = NULL;
void * ptr2 = NULL;
int ret = do_ptr_work(ptr1);
if (!ret)
ret = do_ptr_work(ptr2);
// Tidy up...
if (ptr1) {
free(ptr1);
ptr1 = NULL;
}
if (ptr2) {
free(ptr2);
ptr2 = NULL;
}
return ret;
}