[Moscow.pm] Как народ борится с глобальным деструктором

Alexander Lourier aml на rulezz.ru
Ср Май 21 04:44:20 PDT 2008


В сообщении от 21 мая 2008 14:31 Dmitry Nizovtsev написал(a):

> Здраствуйте
> Проблема в следущем есть обьект A который содержит ссылку на обьект B.
> В деструкторе обьекта A используется ссылка на обьект B - всё хорошо
> работает пока дело не доходит до глобального десктруктора. Глобальный
> деструктор уничожает обьект B раньше обьекта A и естественно  обьект A не
> может выполнить всех необхдимых действий в своём деструкторе.
> Что народ может посоветовать в таком случае?

Используйте слабые ссылки с B в A, тогда A уничтожится первым.

perldoc Hash::NoRef

==
NAME
       Hash::NoRef - A HASH that store values without increase the reference 
count (weak references).

DESCRIPTION
       This HASH will store it’s values without increase the reference count.  
This can be used to store objects but
       without interfere in the DESTROY mechanism, since the reference in this 
HASH won’t count.

USAGE
         use Hash::NoRef ;

         my %hash ;
         tie(%hash , ’Hash::NoRef’) ;

         ...

         ## Or getting a HASH ref tied:

         my $hash = new Hash::NoRef() ;

         {
           my $obj = new FOO() ;
           $hash->{obj} = $obj ;
           ## When we exit this block $obj will be destroied,
           ## even with it stored in $hash->{obj}
         }

         $hash->{obj} ## is undef now!
==

-- 
Alexander Lourier, http://aml.rulezz.ru


Подробная информация о списке рассылки Moscow-pm