2016-09-22 3 views
11

Может ли использовать goto с этикетками вызвать утечку памяти? Все, что я нашел в documentation for goto, что кажется актуальным является:Может ли `goto LABEL` вызвать утечку памяти?

goto LABEL форма находит оператор, помеченный с LABEL и возобновляет выполнение там.

Можно ли использовать goto LABEL?

+6

http://www.perlmonks.org/?node_id=1159029 может помочь – Dada

+0

В Perl, если вы не создаете никаких круговых зависимостей (то есть ссылок на вещи, которые указывают на себя), которые вы вручную очищаете, все очищается (автоматическая сборка мусора), когда текущая область выходит. Конечной областью является сам файл сценария. – stevieb

+4

все, что сказал, я бы рекомендовал структурировать код таким образом, чтобы он не нуждался в 'goto' (это довольно просто). Если в цикле мы имеем 'next' и' last'. – stevieb

ответ

2

Через 1 минуту испытаний, ответ кажется: данет (см обновление ниже)

Наблюдение top в то время как это работает, %MEM постоянно увеличивает

{ 
    THIS: 
    my $x = 1; 
    goto THIS; 
} 

Это делает не имеют одинакового приращения %MEM счетчик

while (1) { 
    my $x = 1; 
} 

ОБНОВЛЕНИЕ

Я неправильно понял вопрос. Мой вопрос заключается в том, будет ли память выделена для лексической переменной, которая уже существует в этой лексической области с использованием goto, и мой тест, кажется, говорит «да». Строго говоря, это не утечка памяти. Если perl когда-либо выйдет из этой лексической области, выделенное пространство будет выпущено.

+9

не является утечкой, так как perl не теряет память и освобождает его при выходе из области. – ysth

+0

, чтобы убедиться, что я получил это, в вашем примере, Perl по-прежнему будет отслеживать все 'my $ x' для каждого 'goto' и в этом случае в конечном итоге будет заполнять всю доступную память? – yonyon100

+0

yonyon100: похоже, да. Я только запускал первый пример около 1 минуты, а использование памяти продолжало расти. – Joshua

Смежные вопросы