Умные указатели в C++
От: Igor Semenov www.progz.ru
Дата: 17.07.08 15:49
Оценка: 286 (11) +1
Статья:
Умные указатели в C++
Автор(ы): Igor Semenov
Дата: 17.07.2008
В этой статье приводится обзор инструментов, позволяющих избежать части проблем, связанных с использованием динамической памяти в C++. Описанные ниже инструменты и методики не являются панацеей от проблем управления памятью, они всего лишь способны облегчить жизнь программисту при условии правильного их использования. Эти инструменты носят общее название «умные указатели» («smart pointers»), что подразумевает их семантическое сходство с обыкновенными указателями C++.


Авторы:
Igor Semenov

Аннотация:
В этой статье приводится обзор инструментов, позволяющих избежать части проблем, связанных с использованием динамической памяти в C++. Описанные ниже инструменты и методики не являются панацеей от проблем управления памятью, они всего лишь способны облегчить жизнь программисту при условии правильного их использования. Эти инструменты носят общее название «умные указатели» («smart pointers»), что подразумевает их семантическое сходство с обыкновенными указателями C++.
Re: Умные указатели в C++
От: Kirikaza Россия kirikaza.ru
Дата: 29.08.08 04:16
Оценка: 1 (1)
Выровняйте код, пожалуйста. А то его вид отпугнёт и так немногочисленных увлечённых С++. =)
Re: Умные указатели в C++
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.08.08 05:01
Оценка:
IS>weak_ptr ссылается на экземпляр, которым владеет shared_ptr, однако не разделяет прав владения этим экземпляром. Это гарантирует, что если экземпляр уже уничтожен, мы сможем это надёжно и безопасно проверить.

class MyClass
{
public:
  MyClass(const std::tr1::weak_ptr<SomeClass>& ptr) :
      ptr_(ptr)
  {
  }

  void SomeMethod()
  {
    if (!ptr_.expired())
    {
      std::tr1::shared_ptr<SomeClass> realPtr(ptr_.lock()); 
      realPtr->DoSomething();
    }
  }

private:
  std::tr1::weak_ptr<SomeClass> ptr_;
};


Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.
Re[2]: Умные указатели в C++
От: Igor Semenov www.progz.ru
Дата: 29.08.08 09:15
Оценка:
Здравствуйте, Kirikaza, Вы писали:

K>Выровняйте код, пожалуйста. А то его вид отпугнёт и так немногочисленных увлечённых С++. =)


В варианте, который я отправлял на редактуру, всё было выровнено...
Re[2]: Умные указатели в C++
От: Igor Semenov www.progz.ru
Дата: 29.08.08 09:19
Оценка: +1
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.


В статье я умышленно не рассматривал вопросы, связанные с работой в многопоточной среде, чтобы не усложнять тему.
Возможно, в следующей версии статьи я исправлю этот недостаток.
Re[2]: Умные указатели в C++
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.08.08 11:10
Оценка:
Здравствуйте, Kirikaza, Вы писали:

K>Выровняйте код, пожалуйста. А то его вид отпугнёт и так немногочисленных увлечённых С++. =)


как только разберемся чего его так корежит
... << RSDN@Home 1.2.0 alpha 4 rev. 1110>>
Re[3]: Умные указатели в C++
От: placement_new  
Дата: 29.08.08 12:06
Оценка:
Здравствуйте, Igor Semenov, Вы писали:

IS>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.


IS>В статье я умышленно не рассматривал вопросы, связанные с работой в многопоточной среде, чтобы не усложнять тему.

IS>Возможно, в следующей версии статьи я исправлю этот недостаток.
Актуальна ли статья?
По моем даже те кто буст толком не знает, уж смартпоинтеры то точно юзает
Re[3]: Умные указатели в C++
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.10.08 10:36
Оценка:
OE>Здравствуйте, Kirikaza, Вы писали:

K>>Выровняйте код, пожалуйста. А то его вид отпугнёт и так немногочисленных увлечённых С++. =)

OE>как только разберемся чего его так корежит

разобрались, подровняли
Re: Умные указатели в C++
От: anonim_44ax  
Дата: 29.10.08 10:35
Оценка:
Простите за ханжество, но мне лично кажется, что статья скажем слегка несвоевременна. Т.е. понятно, что всегда будут новички, которые не знают о перечисленных типах указателей, но, если серьёзно, то мне кажется, что действительно стоящая статья помимо пережёвывания давно известных методик (уж что-что, а "умные указатели" не описывал только ленивый — почти все современные авторы книг об этом трубили) должна приносить что-то новое.
Вот когда это дело ("умные указатели") только начиналось, тогда взять и исследовать их поведение, да написать подобную статью, было действительно стоящим делом. А описать своими словами давно известное многим — да, не плохо, может даже хорошо, но...

П.С.
Заметьте, я не говорил ничего вроде "статья никуда не годится", "плохо" или что-то в этом роде. Написано грамотно, автор воды не лил (к счастью явно не была использована "техника Шилдта/Зверька" — навалять много текста, чтобы дороже или круче вышло ), новичкам вероятно (если им будет влом читать стоящие книги Йосюттиса, Карлсона или help с www.boost.org) пригодится.
Это просто маленькое замечание, не более.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.