Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > weak_ptr + shared_ptr


Автор: bel_nikita 23.8.2006, 00:40
САБЖ

Автор: Daevaorn 23.8.2006, 07:10
Код

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

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

Автор: bel_nikita 23.8.2006, 09:23
Не совсем въехал.

Код

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)