将ref返回到子例程中声明的哈希会导致内存泄漏吗?

时间:2012-02-26 11:20:03

标签: perl memory-leaks perl5 hashref hash-reference

正在使用 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 = {};

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

Perl不是C。

这是你问题的实际答案,但我会稍微扩展一下。

Perl不是C,因为Perl没有自动变量。它有词汇和动态变量,就是这样。

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

Perl不是C,因为作为解释语言的成本在大多数性能计算中占主导地位,因此微优化散列与hashrefs几乎总是无关紧要。

使用更自然地表达您的意图的任何构造。泄漏的记忆力不会超过另一个; Amdahl可以担心微小的性能差异。 Perl不是C.

相关问题