![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| gcc |
|
||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
видел несколько частей кода с применением Scalar::Util, там дополнительный возможности работы с хэшами массива и т.д.
не понимаю где надо применять этот weaken какой смысл от них, то есть это цыклическая ссылка, но как она передается? там можно прицепить любой метод при наследовании наверное? хочется, узнать зачем это - может пригодиться...
|
||||||
|
|||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
gcc, предположим у тебя есть объект UsersGroup у него есть свойство users, в котором хранится массив ссылок на объекты User. В объекте User есть поле group, в котором хранится ссылка на объект UsersGroup. Т.е. получаем взаимные ссылки, которые не позволять освободить память, занятую объектами после удаления всех остальных ссылок на них (дестукторы объектов помочь не могут, т.к. они не вызываются). В подобных случаях помогают "слабые" ссылки. В нашем случае мы сделаем слабой ссылку на объект UsersGroup в объекте User. При создании слабой ссылки счетчик ссылок у объекта User не увеличивается. Это приводит к тому, что при удалении всех остальных ссылок, кроме слабой объект уничтожается. Это нужно иметь ввиду при выборе кандидата на слабую ссылку.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
понял, мне показалось что это что-то другое А если сделать копию объекта UsersGroup и название его по другому, или что-то примерно этого, то тогда можно и не использовать weaken... наверное, попробую тогда когда будет такая задача |
|||
|
||||
| ginnie |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Приведу пример:
В примере я использую модуль Devel::Leak::Object, который показывает объекты, остающиеся после автоматической "сборки мусора" интерпретатором. Без использования слабой ссылки мы получаем
т.е. в памяти осталось два объекта: один класса UsersGroup, второй - User. После раскомментирования строки создания слабой ссылки в классе User получаем:
т.е. никаких объектов в памяти не остается. Если же мы сделаем слабой ссылку на объект User в классе UsersGroup, то получим
т.к. никаких ссылок, кроме слабой на объект User нет, он уничтожается сразу после создания слабой ссылки, о чем свидетельствует сообщение об ошибке. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||||
|
|||||||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |