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

Использует мои% данные; ниже нормально, или я должен переключиться на мои $ 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; выделяется в стеке, а затем этот адрес возвращается - не будетэто утечка памяти или, может быть, не «утечка», а «проблема»?Потому что в стеке будет выделена память, на которую все еще ссылаются и, следовательно, она не может быть освобождена.

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

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Perl - это не C.

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

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

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

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

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

0 голосов
/ 26 февраля 2012

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

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

...