Вызывает ли утечка памяти возврат ссылки на хеш, объявленный в подпрограмме?

Использует мои% данные; ниже хорошо или я должен переключиться на мои $ data = {};?

#!/usr/bin/perl -wT
use strict;
use JSON;

sub makeJson {
        my %data;

        $data{kib} = 1;
        $data{games} = {
                0 => [],
                1 => [qw(a b c d e)],
        };

        return \%data;
}

my $x = makeJson();
print encode_json($x) . "\n";

Я в замешательстве, потому что -

Если makeJson() вызывается несколько раз - и my %data; выделяется в стеке, а затем возвращается этот адрес - не будет ли это утечкой памяти или, может быть, не "утечкой", а "проблемой"? Потому что в стеке будет выделена память, на которую все еще ссылаются, и, следовательно, она не может быть освобождена.

И наоборот: если у меня есть подпрограмма, возвращающая ссылку на хеш, то лучше использовать мои% data; (быстрее, потому что предварительно выделено компилятором?) или мои $ data = {};?

2 ответа

Решение

Perl не C.

Это фактический ответ на ваш вопрос, но я немного расширю.

Perl не является C в том смысле, что Perl не имеет автоматических переменных. У него есть лексические и динамические переменные и все.

Perl не является C в том смысле, что Perl управляет памятью, так что вам (в основном) это не нужно. Отсутствуют циклические ссылки, утечки памяти не происходит.

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

Используйте любую конструкцию, более естественно выражающую ваше намерение. Ни один не пропускает память больше, чем другой; Amdahl может беспокоиться о крошечных различиях в производительности. Perl не C.

Perl (и многие другие интерпретируемые языки) не имеют понятия стека, как скомпилированные языки. Вместо этого у него есть общие правила. Следовательно, Perl может гарантировать отсутствие утечек памяти.

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

Другие вопросы по тегам