Perl在对象销毁时不会调用DESTROY的情况?
这是我的同事所面临的一个令人困惑的问题.而且我也无法解决问题.
短版本是在他编写的类中,其中定义了DESTROY析构函数/方法,当对象被销毁时不会调用DESTROY.在我们认为对象超出范围的时刻,它不会被调用.虽然我们认为可能在某个地方有一个悬空引用它,但它也没有在脚本退出时被调用.我们已经使用调试print语句填充了类和脚本,甚至在END块中对它进行了显式调用,只是为了验证我们没有以某种方式将它放在错误的命名空间中. (我们没有.显式调用按预期触发了所有打印语句.) 所以我对此感到困惑,并且他对答案的兴趣与他一样.什么情况可能导致这种行为?有问题的脚本正在彻底退出 – 没有调用POSIX :: _ exit或类似的东西.这里唯一的“变量”是该类使用 解决方法
没有看到代码,就无法知道出了什么问题.但是我可以想象一下这样一个场景:看起来你的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,马蒂亚斯 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |