Будет ли использование goto причиной утечки памяти?
У меня есть программа, в которой мне нужно вырваться из большого количества вложенных циклов. До сих пор большинство людей говорили мне, чтобы сделать это, используя уродливый goto в моем коде.
Теперь, если я создаю кучу локальных стеков (я думаю, это то, что они называются, если нет, я имею в виду просто обычные переменные без использования новой команды), переменные внутри моих циклов, и моя программа выполняет этот оператор if, который вызывает goto, я столкнусь с утечкой памяти из-за моей программы, неправильно выходящей из многих циклов и не очищающей локальные переменные?
10 ответов
Нет, вы не будете вызывать утечку памяти. Используя goto
это не "выход из петель неправильно". Это просто не рекомендуется с точки зрения структуры кода.
Кроме того, когда вы выходите из цикла, локальные переменные выходят из области видимости и выталкиваются из стека (т. Е. Очищаются) в процессе.
Переменные стека (autos, а не autobots) не являются "утечками", как переменные, распределенные с помощью new() или malloc().
Что касается "безобразия" gotos, то это просто догматично. Читай Кнута, он был таким же блестящим, как Дейкстра. http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf Избегайте программирования на основе пасты, но осторожное использование не приведет к ухудшению качества спагетти.
Дейкстре они не понравились, ПОТОМУ ЧТО большинство того, что вы можете сделать с помощью gotos, может быть выполнено с помощью других методов структурированного программирования и использует меньше кода, что делает другие структурированные менее подверженными ошибкам.
Поймите, что gotos не должно быть вашим первым решением, и не старайтесь использовать их, но, если это имеет смысл, не подчиняйтесь догматическим мобам-ловлям. Оператор break - это просто замаскированное goto, разработанное для случаев, когда строгое соблюдение заповеди "не используй gotos" не имело смысла.
Нет. Вы можете использовать только динамически выделенную память.
Переменные стека определяются (и распределяются) в тот момент, когда вы входите в функцию, и неявно исключаются в тот момент, когда вы покидаете функцию (поскольку вся запись стека вызовов удалена). Никакое колебание внутри функции не может вызвать хаос в памяти, которая была выделена все время. Независимо от того, какой путь выполнения вы пройдете по коду, запись стека появится, когда управление вернется к вызывающей функции, и память будет освобождена.
Другие ответы верны.... однако, если вам придется вкладывать циклы по-другому, я бы поставил под сомнение дизайн, который их туда поместил. Разделение этой логики на отдельные функции было бы лучшим способом решения такой проблемы.
Billy3
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;
}
Это напечатает:
Внутри области
Деструктор
После л этикетки
Нету. Локальные переменные не нуждаются в индивидуальной очистке. Когда стек выпадет, все локальные переменные исчезнут вместе с ним.
Будет ли обратная утечка ресурсов? Или любые другие потенциальные проблемы с кодом ниже?
повторно выполнять:
try
{
//Setup request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
....
//Get Response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if(response != HttpStatus.OK && noOfRetries < 3)
{
noOfRetries++;
Thread.Sleep(10 * 1000);
response.Close();
goto Reexecute;
}
...
response.Close();
}
catch
{
}
Нет вы не будете.
Тем не менее, убедитесь, что все внешние ресурсы освобождены должным образом. Например, если вы открыли файл, можно было бы перепрыгнуть через то место, где он обычно был бы закрыт.
Нет, любые автоматические переменные в ваших циклах не вызовут утечек в программировании, если вы выйдете из своих циклов с помощью оператора goto.