3

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

4

5 回答 5

15
  • 您需要这样做非常奇怪。正确使用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);
于 2013-07-30T01:00:18.870 回答
3
@array = (); 

很好,你也可以使用

undef @array; 

请注意,这是错误的:

@array = undef;

它的价值为undef

于 2013-07-30T00:54:02.020 回答
1

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

有关更多详细信息,请查看以下链接
http://www.perlmonks.org/?node_id=243025
在 Perl 中,如何向操作系统释放内存?

于 2013-07-30T01:28:46.820 回答
0

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

undef @array; 

应该做你需要的。

于 2013-07-30T00:52:42.760 回答
0

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

my @tmp_arr = qw();
@array = @tmp_arr;
于 2018-09-06T12:20:39.170 回答