![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TInterfacedObject борьба с circular references
Unknown user © (2012-03-29 09:56:00)Расскажите, каким способом вы боретесь с такой ситуацией. Имеются интерфейсные объекты Parent и Child. Parent содержит ссылку на Child, а Child на Parent.
Parent.FChild
Child.FParent
В итоге RefCount обоих объектов никогда не достигает 0 и объекты не освобождаются.
Unknown user (2012-04-04 17:50:00) [1]Так и сделал, спасибо.
jack128_ (2012-04-04 17:46:00) [2]Ну тогда только ручками. в destroy родителя обнуляй ссылки в чайлде, при уничтожении чайлда - обнуляй ссылку у родителя.
Unknown user (2012-04-04 16:46:00) [3]>jack128_
Нет не подходит.
Во-первых, у меня оба класса - родительский и дочерний являются предками одного и того же базового класса, основанного на TInterfacedObject.
Во-вторых. Вот выдержка из хелпа
Aggregated objects must not maintain their own reference count - they must have the same lifetime as their controller.
TContainedObject is an aggregated object that isolates QueryInterface on the aggregate from the controller.
Мне же надо, использовать дочерние объекты и без родительского класса. С полноценным подсчетом ссылок.
jack128_ (2012-04-04 16:26:00) [4]TContainedObject не ?
Unknown user (2012-03-29 16:21:00) [5]Pointer - чревато исключениями. Хотя конечно любое неосторожное программирование этим чревато.
Вот нашел такое решение
http://www.finalbuilder.com/Resources/Blogs/TabId/181/PostId/410/WeakRefence-in-Delphi-solving-circular-interfac.aspx
Никто не использовал?
Оказывается в .NET и вообще в языках с автоматической сборкой мусора такой проблемы нет. Если объекты связаны между собой, но снаружи на них никто не ссылается они безболезнено удаляются.
Дмитрий С (2012-03-29 11:37:00) [6]У одного из них сделай ссылку типа Pointer
Сергей М. (2012-03-29 11:30:00) [7]убить друг-друга одновременнно по обоюдному согласию - это дорогого стОит)
Ega23 (2012-03-29 11:27:00) [8]Не надо их делать, и всё.