Perl 子程序中的变量不会释放内存

Posted

技术标签:

【中文标题】Perl 子程序中的变量不会释放内存【英文标题】:Variables in Perl subroutines do not release the memories 【发布时间】:2014-12-13 09:30:52 【问题描述】:

我有一个关于子程序中的变量何时以及如何释放内存的问题。该脚本是一个示例:

#!perl/bin/per
use strict;
sub A
    my $x= shift;
    return ([$x]);

for my $i (1..10)
    my $ref= &A($i);## the input changes in each round
    my $ref2= &A(9);## the input is fixed in each round
    print "$ref\t";
    print "$ref2\n";

屏幕上的输出是:

ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)
ARRAY(0x996e98) ARRAY(0x9b50c8)

我希望在多次调用子例程 A 时应该更改引用,但无论输入何时更改,输出引用都是固定的。这种现象是否可以推断出一个子程序中变量所占用的内存,直到整个脚本结束才能释放?否则,我的结果是否异常?

【问题讨论】:

【参考方案1】:
    A($i) 的调用会在 perl 认为方便可用的任何位置分配一个新的 arrayref。 该数组引用将返回到您的循环体,并存储在一个词法范围为该循环体的变量中。 在循环的底部,变量超出范围,并且没有其他任何引用该 arrayref,arrayref 被释放。 因此,以前保存 arrayref 的内存位置再次方便地使用,并且在下次需要时被重用......在下一次调用 A() 转到 1

如果您阻止数组被释放,您将看到在不同地址创建的新数组。

my @a;
for my $i (1..10)
    my $ref= &A($i);## the input changes in each round
    my $ref2= &A(9);## the input is fixed in each round
    print "$ref\t";
    print "$ref2\n";
    push @a, $ref, $ref2;

【讨论】:

以上是关于Perl 子程序中的变量不会释放内存的主要内容,如果未能解决你的问题,请参考以下文章

内存释放

在Java程序中这样会不会造成内存泄漏?

解析PHP中的内存管理,PHP动态分配和释放内存

学习笔记类对象的内存释放

java在循环语句的执行语句赋予变量值循环结束后会释放吗?

内存管理