in reply to Re^3: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
in thread Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?

Also keep in mind that Perl can reuse refs after destructions, tho I doubt this happens when there is still a weakened ref around. (?)

If all the strong refs to an object go away, it gets freed; there is nothing stopping the memory being reused after that.

When a reference is weakened, a flag is set on the reference, and a record of the reference is added to a list of weakrefs attached to the object (stored under PERL_MAGIC_backref magic). When the object gets freed, it uses that list to set the affected weakrefs to undef to keep things safe.

Note that the weakrefs are stored as a simple list, so freeing a weakref can get expensive when an individual object has many weakrefs to it: it has to do an O(n) scan of the list to find the entry to remove, so removing all of the weakrefs individually is O(n^2) whereas removing them in one go by freeing the object is O(n).

  • Comment on Re^4: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
  • Download Code

Replies are listed 'Best First'.
Re^5: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
by LanX (Saint) on Jan 21, 2024 at 19:37 UTC
    Thanks, that sounds like the good design I expected. 👍🏼

    Apart from the note about the complexity of long lists, but yeah having tons of weak refs is hopefully only a rare edge case. :)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

    update

    See also perlref#Circular-References