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

Alexander Lourier aml на rulezz.ru
Ср Май 21 05:10:14 PDT 2008


В сообщении от 21 мая 2008 16:04 Ivan B. Serezhkin написал(a):

> Alexander Lourier wrote:
> > В сообщении от 21 мая 2008 15:55 Ivan B. Serezhkin написал(a):
> >> Alexander Lourier wrote:
> >>> Используйте слабые ссылки с B в A, тогда A уничтожится первым.
> >>
> >> Там как раз обратная ситуация.
> >
> > Почему обратная? Если ссылка с B на A слабая, то первым вызовется
> > A::DESTROY, он сможет все корректно сделать, объект A умрет и освободит
> > B. Или я неправ?
>
> Всё так, но я не думаю что грамотный программист будет делать слабыми
> ссылки на детей.

1. Никто не сказал, что A и B это дети.
2. Как раз ссылка на родителя, по логике, должна быть слабой, именно тогда 
родитель первым сможет разрушиться, пока его дети целые и можно ими 
попользоваться. Деструкторы детей будут вызываться после родителя, и они 
должны корректно обрабатывать ситуацию !defined($self->{parent}).

> Слабыми должны быть ссылки на парентов и только.
> Нормальному человеку врятли придёт в голову сделать иначе.

В особо изощренных ситуациях, наверное, имеет смысл инкапсулировать A и B в 
еще какой-то класс, который будет знать ссылки на них, и в своем деструкторе 
вручную разруливать порядок разрушения.

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


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