Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> weak_ptr + shared_ptr, объясните связку на примере каком 
:(
    Опции темы
bel_nikita
Дата 23.8.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



САБЖ


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 23.8.2006, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Код

struct CBetterChild : public CSample
{
  weak_ptr<CDad> myDad;// слабая ссылка
  //...

  void BringBeer()
  {
    shared_ptr<CDad> strongDad = myDad.lock(); // требуем сильную ссылку
    if (strongDad)                      // объект ещё жив?
      strongDad->SetBeer();
    // strongDad освободит(не удалит!) указатель когда выйдет из зоны видимости
  }
};

PM MAIL WWW   Вверх
bel_nikita
Дата 23.8.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Не совсем въехал.

Код

struct CBetterChild : public CSample
{
  shared_ptr<CDad> myDad;
  //...

  void BringBeer()
  {
    if ( strongDad )                      // объект ещё жив?
      strongDad->SetBeer();
    // strongDad освободит(не удалит!) указатель когда выйдет из зоны видимости
  }
};

в чем разница?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 23.8.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



В том, что CBetterChild в твоем коде "держит" папу. Т.е. пока чайлд не удален, папа живет. А если у папы, в свою очередь, есть такая ссылка на чайлд, то получается петля, которую никто не разорвет: оба объекта держат друг друга и не удаляются, хотя других ссылок на них уже нет... week_ptr  - это как раз для избежания такой циклической связи, когда 2 объекта должны ссылаться друг на друга. Один из объектов (более главный) хранит ссылку как shared_ptr, второй - как week_ptr. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.