gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:23:21 25 4
gpt4 key购买 nike

这是我的一个同事遇到的一个令人困惑的问题。而且我也无法找出原因。

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

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

最佳答案

没有看到代码,人们无法知道出了什么问题。但我可以想象一个场景,你的 DESTROY() 方法似乎没有被调用:

#!/usr/bin/perl

use strict;
use warnings;

sub DESTROY {
die {};
print "DESTROY\n";
}

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

print "object is out of scope\n";

此脚本打印:
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";

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

半小时,马蒂亚斯

关于perl - Perl 不会在对象销毁时调用 DESTROY 的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10505065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com