1

正在使用我的 %data; 下面还可以,或者我应该切换到我的 $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={}; ?

4

2 回答 2

0

Perl(和许多其他解释语言)没有像编译语言那样的堆栈概念。它有范围规则。因此 Perl 能够确保您不会发生内存泄漏。

事实上,即使它具有相同的堆栈概念,它也只会返回一个无效的地址。

于 2012-02-26T11:24:49.267 回答
0

Perl 不是 C。

这是您问题的实际答案,但我会扩大一点。

Perl 不是 C,因为 Perl 没有自动变量。它有词汇和动态变量,仅此而已。

Perl 不是 C,因为 Perl 进行内存管理,因此您(大多数情况下)不必这样做。没有循环引用,就不会发生内存泄漏。

Perl 不是 C,因为作为解释语言的成本支配了大多数性能计算,因此微优化散列与散列引用几乎总是无关紧要的。

使用更自然地表达您的意图的结构。两者都不会比另一个泄漏更多内存;Amdahl可以担心微小的性能差异。Perl 不是 C。

于 2012-02-28T19:16:11.690 回答