首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写对象时的Perl内存管理

重写对象时的Perl内存管理
EN

Stack Overflow用户
提问于 2015-08-12 17:21:02
回答 3查看 363关注 0票数 3

我的问题是Perl如何在内部管理对象的数据。

在Perl中创建对象时,新的子例程通常会返回对受祝福对象的引用。

以以下代码为例:

代码语言:javascript
复制
# Create a new object
my $object = Object->new(%data1);

# Create a new object with the same variable
$object = Object->new(%data2);

从第一次调用new $object 开始,我们创建了一个,它引用了一些受祝福的 %data1

视觉表现: "\“象征着引用。

代码语言:javascript
复制
$object ════> \{bless %data1}

这在内存中如下所示: "&“象征着地址

代码语言:javascript
复制
MEMORY:
----------------------------------
&{bless %data1} ════> bless %data1

然后,通过第二次调用new $object ,将$object的值更改为引用其他祝福的 %data2

视觉表现:

代码语言:javascript
复制
$object ══/ /══> \{bless %data1}  # The connection to %data1 is broken
   ║
   ╚═══════════> \{bless %data2}

现在,内存应该是这样的:

代码语言:javascript
复制
MEMORY:
----------------------------------
&{bless %data1} ════> bless %data1
&{bless %data2} ════> bless %data2

现在的问题是,$object不再存储引用\{bless %data1}、地址&{bless %data1}和存储在该地址上的任何数据永远丢失。再也没有可能从脚本访问存储在该位置的数据了。

我的问题是。。。一旦对该数据的引用永远丢失,Perl是否足够聪明地删除存储在中的数据,还是将该数据保存在内存中可能导致内存泄漏?

EN

回答 3

Stack Overflow用户

发布于 2015-08-12 18:13:40

你误解了参数传递的方式。$object成为一个新创建的引用,其内容可能会受到传递给构造函数new的数据的影响,但它不会是对散列%data1%data2本身的引用,因为new只获得这些散列的键/值内容。

您的问题的底线似乎是,当不再使用Perl时,Perl是否足够聪明地释放对象,答案是肯定的。

Perl保存对每个数据项的引用数,如果该值降到零(即不再有任何方法到达该数据),则该数据被认为是可重用的。

只有当数据结构包含对其自身的引用时,Perl才能导致内存不足。在这种情况下,外部引用的数量可能会降到零,但是数据本身不会被它自己的引用所删除,从而使计数不会下降到零。

避免包变量,并且只使用用my声明的词法变量也更安全。词法变量将在超出作用域时自动销毁,从而减少它们可能包含的任何引用的数量。使用our声明的包变量将存在于进程的其他生命期,不会触发此安全措施

如果你能多解释一下你为什么需要这些信息,那么我相信你会得到更好的答案。

票数 4
EN

Stack Overflow用户

发布于 2015-08-12 18:17:38

Perl使用一种称为引用计数的方法-它计算一个变量被引用了多少次。它将数据保存在内存中,直到引用计数降到零为止。

在您的示例中,一旦重新分配$object,第一个创建的对象就会自动消失。但是有一个警告--如果在对象和new过程中创建循环引用,则不会发生这种情况。您可以在weaken中使用Scalar::Util来处理这个问题。

您可以通过创建一个DESTROY方法来观察它,当一个对象被“释放”时会调用该方法。

票数 3
EN

Stack Overflow用户

发布于 2015-08-12 17:33:35

有参考计数垃圾收集。我没有看到你的代码中有任何东西会被绊倒,说。即使存在,Scalar::Util等选项也存在缺陷。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31971633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档