gpt4 book ai didi

perl - 使用Scalar::Util 的弱化会导致无效引用问题吗?

转载 作者:行者123 更新时间:2023-12-01 07:36:39 25 4
gpt4 key购买 nike

请看这个related question一些背景信息。

注意:当我说“无效引用”时,我的意思是指不指向任何数据的引用。

假设我们有以下包含循环引用的数据结构:

       +-----------------------------------------------------+
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
$parent -->+============+ [ Hash ] |
[ ] +==========+ |
[ children --->[ Array ] |
[ ] [ ] |
+==========+ [ 0: ---------+ |
[ ] | |
+==========+ | |
| |
+--------------------------------------------------+ |
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
$child --->+============+ [ Hash ] |
[ ] |
[ parent: ----------------------+
[ ]
+==========+

我知道我可以使用 Scalar::Util weaken “弱化”引用的功能。 . .但是如果我削弱来自 parent->child 的引用会发生什么并削弱来自 child->parent 的引用然后是 $child$parent超出范围,但不是另一个?

示例: $parent超出范围,因此引用消失了。
       +-----------------------------------------------------+
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
+============+ [ Hash ] |
[ ] +==========+ |
[ children --->[ Array ] |
[ ] [ ] |
+==========+ [ 0: ---------+ |
[ ] | |
+==========+ | |
| |
would this break the link? ------------> X X
| |
+--------------------------------------------------+ |
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
$child --->+============+ [ Hash ] |
[ ] |
[ parent: ----------------------+ <--- would this parent object pointer now be invalid?
[ ]
+==========+

如果我这样做,然后“父”超出范围, 父对象是否会因为 Perl 对该对象的内部引用计数变为 0 而从内存中删除? 我问这个,因为如果 $child仍然存在并且需要使用来自父对象的一些数据,这会导致问题,因为子对象现在将持有指向父对象的无效指针。

最佳答案

  • my $x = { };
              +============+      +==========+
    $x -----> [ Reference ------->[ Hash ]
    [ REFCNT=1 | [ REFCNT=1 ]
    +============+ [ ]
    +==========+
  • my $y = $x;
              +============+      +==========+
    $x -----> [ Reference ------->[ Hash ]
    [ REFCNT=1 | +-->[ REFCNT=2 ]
    +============+ | [ ]
    | +==========+
    +============+ |
    $y -----> [ Reference ----+
    [ REFCNT=1 |
    +============+
  • weaken($y);
              +============+      +==========+
    $x -----> [ Reference ------->[ Hash ]
    [ REFCNT=1 | +-->[ REFCNT=1 ]
    +============+ | [ BACKREFS ---+
    | +==========+ |
    +============+ | |
    $y -----> [ Weak Ref -----+ |
    +--> [ REFCNT=1 | |
    | +============+ |
    +--------------------------------------+

    除了设置WEAKREF引用中的标志,被引用变量的引用计数降低,并创建了反向引用。

  • 场景一

    $y超出范围,第二个引用的 REFCNT 将降为零,这将释放引用。这通常会删除散列的引用计数,除非释放的引用是弱引用。所以它会简单地将自己从反向引用列表中删除。
              +============+      +==========+
    $x -----> [ Reference ------->[ Hash ]
    [ REFCNT=1 | [ REFCNT=1 ]
    +============+ [ ]
    +==========+

    场景二

    $x超出范围,第一个引用的 REFCNT 将降为零,这将释放引用,这会将散列的引用计数降为零,这将导致散列被释放。作为其中的一部分,每个反向引用的变量都将被取消定义。
              +============+
    $y -----> [ Undefined |
    [ REFCNT=1 |
    +============+

    此时 print("$y->{foo}\n");会发出咝咝声(退出时显示错误消息,而不是分段违规),您可以通过检查 $y 来避免这种情况。首先定义。

    关于perl - 使用Scalar::Util 的弱化会导致无效引用问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013133/

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