加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl在对象销毁时不会调用DESTROY的情况?

发布时间:2020-12-15 23:26:52 所属栏目:大数据 来源:网络整理
导读:这是我的同事所面临的一个令人困惑的问题.而且我也无法解决问题. 短版本是在他编写的类中,其中定义了DESTROY析构函数/方法,当对象被销毁时不会调用DESTROY.在我们认为对象超出范围的时刻,它不会被调用.虽然我们认为可能在某个地方有一个悬空引用它,但它也没
这是我的同事所面临的一个令人困惑的问题.而且我也无法解决问题.

短版本是在他编写的类中,其中定义了DESTROY析构函数/方法,当对象被销毁时不会调用DESTROY.在我们认为对象超出范围的时刻,它不会被调用.虽然我们认为可能在某个地方有一个悬空引用它,但它也没有在脚本退出时被调用.我们已经使用调试print语句填充了类和脚本,甚至在END块中对它进行了显式调用,只是为了验证我们没有以某种方式将它放在错误的命名空间中. (我们没有.显式调用按预期触发了所有打印语句.)

所以我对此感到困惑,并且他对答案的兴趣与他一样.什么情况可能导致这种行为?有问题的脚本正在彻底退出 – 没有调用POSIX :: _ exit或类似的东西.这里唯一的“变量”是该类使用Class::MethodMaker来定义一些访问器和构造函数.但是,Class :: MethodMaker文档中没有引用与类DESTROY方法进行交互(或覆盖).

解决方法

没有看到代码,就无法知道出了什么问题.但是我可以想象一下这样一个场景:看起来你的DESTROY()方法没有被调用:

#!/usr/bin/perl

use strict;
use warnings;

sub DESTROY {
    die {};
    print "DESTROYn";
}

{
    print "creating object...n";
    my $obj = bless {};
    print "it goes out of scope...n";
}

print "object is out of scopen";

这个脚本打印:

creating object...
it goes out of scope...
object is out of scope

可能,错误并不像本例中那么明显. die()调用可能在DESTROY代码中很深.

die()调用可能是由您没有想到的某些条件引起的.在全局破坏期间,对象以任意顺序未定义:

#!/usr/bin/perl

use strict;
use warnings;

sub DESTROY {
    die {} if ! defined $_[0]->[0];
    print "$_[0]->DESTROY()n";
}

print "creating objects...n";
my $x = bless [];
my $y = bless [$x];
$x->[0] = $y;
print "before global destruction...n";

循环引用并非必须发生这种情况.其中一个对象检查它是否可以访问另一个对象.如果访问失败,则抛出异常.

h2h,马蒂亚斯

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读