我想删除整个数组。目前我做@array=();
它是否删除元素并清除内存,垃圾收集?如果不是,我需要使用Splice吗?。
答案 0 :(得分: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 :(得分:1)
@array = ();
没问题,你也可以用
undef @array;
请注意,这是错误:
@array = undef;
它的值为undef
答案 2 :(得分:1)
如果您的目标是将内存释放回操作系统,那么您可能会运气不好。如果你的目标是让你的perl程序的内存可以再次使用,那么其他答案都是好的。
有关更多详细信息,请查看以下链接
http://www.perlmonks.org/?node_id=243025
In Perl, how can I release memory to the operating system?
答案 3 :(得分:0)
答案 4 :(得分:0)
所有这些食谱都帮不了我,但是我找到了一个新食谱:
my @tmp_arr = qw();
@array = @tmp_arr;