正在使用 my%data; ,或者我应该切换到 my $ 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 = {}; ?
答案 0 :(得分:0)
Perl(以及许多其他解释语言)没有像编译语言那样的堆栈概念。它取而代之的是范围规则。因此,Perl能够确保您不会发生内存泄漏。
实际上,即使它具有相同的堆栈概念,它也只会返回一个无效的地址。
答案 1 :(得分:0)
Perl不是C。
这是你问题的实际答案,但我会稍微扩展一下。
Perl不是C,因为Perl没有自动变量。它有词汇和动态变量,就是这样。
Perl不是C,因为Perl会进行内存管理,因此您(大多数情况下)不必这样做。如果没有循环引用,则不会发生内存泄漏。
Perl不是C,因为作为解释语言的成本在大多数性能计算中占主导地位,因此微优化散列与hashrefs几乎总是无关紧要。
使用更自然地表达您的意图的任何构造。泄漏的记忆力不会超过另一个; Amdahl可以担心微小的性能差异。 Perl不是C.