В настоящее время я работаю над проектом, в котором успешно используются инструкции goto. Основная цель операторов goto состоит в том, чтобы иметь один раздел очистки в подпрограмме, а не в нескольких операторах return. Как ниже:
BOOL foo()
{
   BOOL bRetVal = FALSE;
   int *p = NULL;
   p = new int;
   if (p == NULL)
   {
     cout<<" OOM \n";
     goto Exit;
   }
   // Lot of code...
Exit:
   if(p)
   {
     delete p;
     p = NULL;
   }
   return bRetVal;
}
Это упрощает процесс отслеживания нашего кода очистки в одном разделе кода, то есть после метки Exit.
Тем не менее, я прочитал много мест, в которых плохая практика имеет инструкции goto.
В настоящее время я читаю Code Complete, и он говорит, что нам нужно использовать переменные, близкие к их объявлениям. Если мы используем goto, тогда нам нужно объявить/инициализировать все переменные перед первым использованием goto, иначе компилятор даст ошибки, которые инициализация переменной xx пропускается с помощью инструкции goto.
Какой путь прав?
Из комментария Скотта:
Похоже, что использование goto для перехода из одной секции в другую плохо, поскольку это делает код трудным для чтения и понимания.
Но если мы используем goto только для продвижения вперед и к одной метке, тогда это должно быть хорошо (?).
