【问题标题】:Deleting a reference to free memory删除对空闲内存的引用
【发布时间】:2017-03-23 01:20:58
【问题描述】:

想象一下,我有一个指向包含许多匿名数组的数组的引用。例如:

my @main_array = ( [1,2,3], [3,4,5], ['a','b','c'] );
my $reference = \@main_array

如果稍后我使用完该数组中的数据并且我只有一个引用,那么删除该数组并释放内存的最佳方法是什么? 我通常执行以下操作来释放简单数组中数据使用的内存:

undef @array

但因为我只有一个参考,所以我考虑这样做

undef @{$reference}

如果我这样做,我会不会只是删除对存储在数组 (main_array) 中的匿名数组的引用而不是匿名数组的实际内容?

我想我的问题可以简化为:删除引用是否会使 Perl 释放引用所引用的数组、散列或标量使用的内存?

谢谢

【问题讨论】:

标签: perl memory reference


【解决方案1】:

是的,undef @{$reference}(或undef @$reference)会做undef @array 所做的事情。它将释放数组使用的几乎所有内存以供程序重用。

但很少有充分的理由这样做。当你的词法 $reference 超出范围时,同样的事情也会发生。首先显式调用 undef 只会让你的代码慢一点。

【讨论】:

  • 我应该提到我的数组有大量的项目并且它在脚本运行的整个时间内都存在。这是因为脚本需要从不同的来源收集数据,并且所有数据都需要在脚本的最后进行处理,所以我必须将数据保存在内存中。有些部分我必须创建子数组,而这些子数组是我尝试删除以释放内存并避免重复数据的部分。谢谢
  • @JohnnyLoo:如果你有临时数据,那么你应该通过用my 声明它来限制它的生命周期并限制它的范围,以便它被自动丢弃。明确使用undef 通常是设计不佳的标志。如果您的数据如此之大,那么您最好使用内存中的 SQLite 数据库。
【解决方案2】:

如果稍后我使用完该数组中的数据并且我只有一个引用,那么删除该数组并释放内存的最佳方法是什么?

理想情况下,让$reference 超出范围即可。否则,您可以使用$reference = undef;

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2018-08-21
    • 2021-02-27
    • 1970-01-01
    • 2012-09-18
    • 2015-08-17
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多