gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:20:47 26 4
gpt4 key购买 nike

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

#!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 时应该更改引用,但是无论何时更改输入,输出引用都是固定的。这种现象是不是可以推断子程序中变量占用的内存在整个脚本结束之前永远无法释放?否则,我的结果不正常吗?

最佳答案

  • 调用 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 - Perl 子程序中的变量不会释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27457413/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com