Будет использование goto вызывать утечки памяти?

Я думаю, что существует много примеров поломок обратной совместимости. Многие языки, которые сделали это, были или маленькими или вымерли по пути.

Много примеров этого включенного переименования языка.

Алгол 60 и Алгол 68 так отличались, что встречи по Алголу 68 разбились на фракции. Алгол 68 фракций, фракция Паскаля и фракция PL/I.

Паскаль Wirth, превращенный в Modula-3. Это было очень похоже на Паскаль - очень похожий синтаксис и семантику - но несколько новых возможностей. Это был действительно Паскаль 2 без обратной совместимости?

Lisp к вещи Схемы включил переименовывание.

, Если Вы разыскиваете сканирование старого язык программирования B руководство, Вы будете видеть, что эволюция к C выглядит довольно возрастающей - не радикальный - но это действительно повреждало совместимость.

Фортран существовал во многих формах. Я не знаю наверняка, но я думаю, что Фортран Digital 90 для VAX/VMS не был абсолютно совместим с древними программами IV Фортрана.

RPG прошел главные перевороты - я думаю, что существует действительно два несовместимых языка, названные RPG.

Нижняя строка я думаю, что взгляды и изучение неизбежно. У Вас есть три ответа на изучение ограничений языка.

  1. Изобретают новый язык, это является совершенно несовместимым.

  2. Возрастающее изменение, пока Вы не вынуждены изобрести новый язык.

  3. совместимость Повреждения управляемым, вдумчивым способом.

я думаю, что № 1 и № 2 являются оба путями труса. Зажимание старого легче, чем попытка сохранить его. Сохранение каждой детальной функции (неважно, как плохо) является большой работой, частью его минимального значения.

Коммерческие предприятия выбирают трусливые подходы от имени "нового маркетинга" или "сохранение наших существующих клиентов". Вот почему коммерческие предприятия программного обеспечения не являются рассадниками инноваций.

я думаю, что [только 1 123] проекты с открытым исходным кодом могут быть инновациями объятия в способе, которым сообщество Python занимается этим изменением.

11
задан Lightness Races with Monica 7 September 2011 в 13:49
поделиться

9 ответов

Нет, вы не вызовете утечки памяти. Использование goto не означает «неправильный выход из цикла». Это просто обычно не рекомендуется с точки зрения структуры кода.

Кроме того, когда вы покидаете цикл, локальные переменные выходят из области видимости и выталкиваются из стека (то есть очищаются) в процессе.

20
ответ дан 3 December 2019 в 02:41
поделиться

Переменные стека (autos, not autobots) не являются «дырявыми», как переменные, выделенные с помощью new () или malloc ().

Что касается «уродства» gotos, это просто догматический. Прочтите Кнута, он был так же гениален, как Дейкстра. http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf Избегайте программирования на основе макаронных изделий, но осторожное использование не превратится в спагетти.

Dijkstra didn ' Мне они нравятся, ПОТОМУ, что большая часть того, что вы можете делать с помощью gotos, может быть выполнено с помощью других методов структурированного программирования и использует меньше кода, что делает другой структурированный менее подверженным ошибкам.

Поймите, что gotos не должны быть вашим первым решением, и не Не старайтесь их использовать, но если это имеет смысл, не подчиняйтесь догматическим мобам-ленчам.

5
ответ дан 3 December 2019 в 02:41
поделиться

Переменные стека определяются (и выделяются) в тот момент, когда вы входите в функцию, и неявно удаляются, когда вы покидаете функцию (поскольку вся запись стека вызовов удаляется). Никакие подпрыгивания внутри функции не могут вызвать хаоса с памятью, которая была выделена все время. Независимо от того, какой путь выполнения вы выберете через код, запись стека появится, когда управление вернется к вызывающей функции, и память будет освобождена.

2
ответ дан 3 December 2019 в 02:41
поделиться

Остальные ответы верны .... однако, если вам нужно вложить циклы по-другому, я бы поставил под вопрос дизайн, в котором они были помещены. Разделение этой логики на отдельные функции было бы лучшим способом решить такую ​​проблему.

Billy3

1
ответ дан 3 December 2019 в 02:41
поделиться

Нет. Возможна утечка только динамически выделяемой памяти.

2
ответ дан 3 December 2019 в 02:41
поделиться

Нет, любые автоматические переменные в ваших циклах не вызовут утечек программирования, если вы прервете цикл с помощью оператора goto.

0
ответ дан 3 December 2019 в 02:41
поделиться

Нет. Локальные переменные не нужно очищать отдельно. Когда стек появится, все локальные переменные исчезнут вместе с ним.

0
ответ дан 3 December 2019 в 02:41
поделиться

Goto - это не всегда плохо, но в вашем случае вам, вероятно, не следует использовать goto.

См. Примеры правильного использования goto здесь и здесь .

Если вы перейдете к метке, которая находится за пределами области видимости, ваш объект в стеке будет освобожден.

Пример:

#include <iostream>
using namespace std;

class A
{
public:
  ~A() 
  {
     cout<<"A destructor"<<endl;
  }
};



int main(int argc, char**argv)
{
  {
    A a;
    cout<<"Inside scope"<<endl;
    goto l;
    cout<<"After l goto"<<endl;
  }

  cout<<"Outside of scope before l label"<<endl;

l:
  cout<<"After l label"<<endl;
  return 0;
}

Будет напечатано:

Внутри области
Деструктор
После l label

1
ответ дан 3 December 2019 в 02:41
поделиться

Нет, не будете.

Однако убедитесь, что все внешние ресурсы освобождены должным образом. Например, если вы открыли файл, можно было бы перескочить туда, где он обычно был бы закрыт.

0
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: