быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
1

Агрегация: почему бы в деструкторе внешнего компонента сразу не приравнять количество ссылок на внешний компонент к единице и всё на этом (по Роджерсо

18.04.2013, 23:36. Показов 1283. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Короче у Рроджерсона пример номер 8, там агрегирование. И он говорит, что нужно в деструкторе внешнего компонента освобождать указатель на внутренний:
"Чего мы ещё не сделали, так это не освободили интерфейс в деструкторе внешнего компонента"
Потом всякие пояснения, которые приводятся к такому коду, давайте к нему сразу и обратимся, это код деструктора внешнего элемента. В нём должен освободиться указатель на внутренний:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CA::~CA() 
{ 
    ::InterlockedDecrement(&g_cComponents) ; 
    trace("Destroy self.") ;
 
    m_cRef = 1 ;
 
    IUnknown* pUnknownOuter = this ;
    pUnknownOuter->AddRef() ;
 
    m_pIY->Release() ;
 
    // Release contained component.
    if (m_pUnknownInner != NULL)   // @N
    {
        m_pUnknownInner->Release() ;
    }
}
Так, а теперь посмотрим что он значит, этот код. Заменяю некоторые участки на идентичные, но более простые. Поступенчато:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CA::~CA() 
{ 
    ::InterlockedDecrement(&g_cComponents) ; 
    trace("Destroy self.") ;
 
    m_cRef = 1 ;
    m_cRef = 1 ;
 
 
    m_pIY->Release() ;
 
    // Release contained component.
    if (m_pUnknownInner != NULL)   // @N
    {
        m_pUnknownInner->Release() ;
    }
}
НЕплохо, да? Поехали дальше:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
CA::~CA() 
{ 
    ::InterlockedDecrement(&g_cComponents) ; 
    trace("Destroy self.") ;
 
    m_cRef = 1 ;
 
    // Release contained component.
    if (m_pUnknownInner != NULL)   // @N
    {
        m_pUnknownInner->Release() ;
    }
}
Всё. То есть всё удаление указателя на интерфейс сводится к тому, чтобы присвоить счётчику ссылок значение 1. Гениально, что сказать.

//+++++++++++++++++++++++++++++++++++

По остальному коду: этот код просто уменьшает количество активных внешних компонентов
C++
1
2
    ::InterlockedDecrement(&g_cComponents) ; 
    trace("Destroy self.") ;
этот делает то же самое в отношение внутреннего компонента через указатель на неделигирующий интерфейс.
C++
1
2
3
4
        if (m_pUnknownInner != NULL)   // @N
    {
        m_pUnknownInner->Release() ;
    }
на фига это всё:
C++
1
2
3
4
5
6
    m_cRef = 1 ;
 
    IUnknown* pUnknownOuter = this ;
    pUnknownOuter->AddRef() ;
 
    m_pIY->Release() ;
Если отлично можно заменить
C++
1
    m_cRef = 1 ;
непонятно. А главное, что даёт это присвоение? Крайне непонятно. Может быть кто-нибудь разъяснит?
0
18.04.2013, 23:36
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,426
19.04.2013, 10:47 2
по выдранным из текста кускам сложно судить для чего это было нужно. телепатически могу предположить, что
1 счетчик ссылок увеличивается при помощи pUnknownOuter->AddRef() потому что это правильно - дергать поле при помощи одного и того же метода вместо доступа к нему 1001 способом
2 смысл увеличения счетчика - освобождение внутреннего объекта наверное приводит к уменьшению счетчика - для предотвращения повторного вызова деструктора при достижении счетчиком нулевого значения нужно увеличить его перед освобождением внутреннего объекта
--
могу ошибаться
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
19.04.2013, 17:52  [ТС] 3
Ну давай я тебе дам Роджерсона. Но там придётся разбираться, сразу говорю.
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,426
20.04.2013, 13:46 4
Цитата Сообщение от kravam Посмотреть сообщение
Ну давай я тебе дам Роджерсона. Но там придётся разбираться, сразу говорю.
спасибо конечно но пока не нуждаюсь
ваши зверские эксперименты над COM и залазания в дебри разноображивают мою жизнь. нафига вам оно ?
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
20.04.2013, 18:05  [ТС] 5
Это последовательность, ничего более. Я просто читаю Роджерсона и пытаюсь его понять. Главу за главой, только и всего. А вы, кстати, читали Роджерсона?
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,426
21.04.2013, 10:17 6
неа. читаю f1 и google
0
21.04.2013, 10:17
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
Laravel или Symfony: что лучше для старта?
Wired 18.02.2025
В веб-разработке выбор правильного фреймворка может стать определяющим фактором успеха проекта. Особенно это актуально для PHP - одного из самых распространенных языков программирования, где Laravel. . .
Что нового в Laravel 12
Wired 18.02.2025
С момента своего появления в 2011 году Laravel постоянно развивается, внедряя инновационные решения и совершенствуя существующие возможности. В начале 2025 года ожидается выход Laravel 12 - новой. . .
Роутер в Laravel: как работать с маршрутами
Wired 18.02.2025
Маршрутизация - один из основополагающих элементов любого веб-приложения на Laravel, определяющий как приложение отвечает на HTTP-запросы к различным URL-адресам. По сути, роутинг - это механизм. . .
Интеграция шаблона Bootstrap в Laravel PHP
Wired 18.02.2025
Разработка веб-приложений в современном мире требует не только надежного бэкенда, но и привлекательного, отзывчивого интерфейса. Laravel, как один из самых популярных PHP-фреймворков, отлично. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru