删除Perl中的数组元素

问题描述 投票:0回答:5

我想删除整个数组。目前我做@array=();它是否删除元素并清除内存,垃圾收集?如果不是,我需要使用Splice吗?

perl
5个回答
10
投票
  • 你需要这样做是非常奇怪的。正确使用my意味着很少需要清空阵列。
  • @array = ();将释放元素,并在必要时调用任何析构函数。换句话说,如果没有在其他地方使用,则根据需要将元素进行垃圾收集(在操作甚至结束之前)。
  • @array = ();不释放底层数组缓冲区。这是一件好事。 undef @array;会强制释放内存,这会在你开始在数组中放入更多元素时强制进行大量分配。

所以,

  • 如果您想要释放数组,因为您再也不会使用它,请将my @array;放在正确的位置,将其范围限制在您需要的位置。 { my @array; ... } # Elements of @array garbage collected here.
  • 如果要清空要重复使用的数组,请使用@array = ();my @array; while (...) { if (...) { push @array, ...; } else { ... use @array ... @array = (); # Elements of @array garbage collected here. } }
  • 不要使用undef @array;

如果方便的话你可以使用splice

 say for @array;
 @array = ();

可写成

 say for splice(@array);

但这不会影响垃圾收集。


1
投票
@array = (); 

很好,你也可以使用

undef @array; 

请注意,这是错误的:

@array = undef;

它的值为undef


1
投票

如果您的目标是将内存释放回操作系统,那么您可能会运气不好。如果你的目标是让你的perl程序的内存可以再次使用,那么其他答案都是好的。

有关更多详细信息,请查看以下链接 http://www.perlmonks.org/?node_id=243025 In Perl, how can I release memory to the operating system?


0
投票

http://perldoc.perl.org/functions/undef.html

undef @array; 

应该做你需要的。


0
投票

所有这些食谱都没有帮助我,但我找到了一个新的食谱:

my @tmp_arr = qw();
@array = @tmp_arr;
© www.soinside.com 2019 - 2024. All rights reserved.