我的问题是Perl如何在内部管理对象的数据。
在Perl中创建对象时,新的子例程通常会返回对受祝福对象的引用。
以以下代码为例:
# Create a new object
my $object = Object->new(%data1);
# Create a new object with the same variable
$object = Object->new(%data2);从第一次调用new $object 开始,我们创建了一个,它引用了一些受祝福的 %data1
视觉表现: "\“象征着引用。
$object ════> \{bless %data1}这在内存中如下所示: "&“象征着地址
MEMORY:
----------------------------------
&{bless %data1} ════> bless %data1然后,通过第二次调用new $object ,将$object的值更改为引用其他祝福的 %data2。
视觉表现:
$object ══/ /══> \{bless %data1} # The connection to %data1 is broken
║
╚═══════════> \{bless %data2}现在,内存应该是这样的:
MEMORY:
----------------------------------
&{bless %data1} ════> bless %data1
&{bless %data2} ════> bless %data2现在的问题是,$object不再存储引用\{bless %data1}、地址&{bless %data1}和存储在该地址上的任何数据永远丢失。再也没有可能从脚本访问存储在该位置的数据了。
我的问题是。。。一旦对该数据的引用永远丢失,Perl是否足够聪明地删除存储在中的数据,还是将该数据保存在内存中可能导致内存泄漏?
发布于 2015-08-12 18:13:40
你误解了参数传递的方式。$object成为一个新创建的引用,其内容可能会受到传递给构造函数new的数据的影响,但它不会是对散列%data1或%data2本身的引用,因为new只获得这些散列的键/值内容。
您的问题的底线似乎是,当不再使用Perl时,Perl是否足够聪明地释放对象,答案是肯定的。
Perl保存对每个数据项的引用数,如果该值降到零(即不再有任何方法到达该数据),则该数据被认为是可重用的。
只有当数据结构包含对其自身的引用时,Perl才能导致内存不足。在这种情况下,外部引用的数量可能会降到零,但是数据本身不会被它自己的引用所删除,从而使计数不会下降到零。
避免包变量,并且只使用用my声明的词法变量也更安全。词法变量将在超出作用域时自动销毁,从而减少它们可能包含的任何引用的数量。使用our声明的包变量将存在于进程的其他生命期,不会触发此安全措施
如果你能多解释一下你为什么需要这些信息,那么我相信你会得到更好的答案。
发布于 2015-08-12 18:17:38
Perl使用一种称为引用计数的方法-它计算一个变量被引用了多少次。它将数据保存在内存中,直到引用计数降到零为止。
在您的示例中,一旦重新分配$object,第一个创建的对象就会自动消失。但是有一个警告--如果在对象和new过程中创建循环引用,则不会发生这种情况。您可以在weaken中使用Scalar::Util来处理这个问题。
您可以通过创建一个DESTROY方法来观察它,当一个对象被“释放”时会调用该方法。
发布于 2015-08-12 17:33:35
有参考计数垃圾收集。我没有看到你的代码中有任何东西会被绊倒,说。即使存在,Scalar::Util等选项也存在缺陷。
https://stackoverflow.com/questions/31971633
复制相似问题