Аннотация:
В этой статье приводится обзор инструментов, позволяющих избежать части проблем, связанных с использованием динамической памяти в C++. Описанные ниже инструменты и методики не являются панацеей от проблем управления памятью, они всего лишь способны облегчить жизнь программисту при условии правильного их использования. Эти инструменты носят общее название «умные указатели» («smart pointers»), что подразумевает их семантическое сходство с обыкновенными указателями C++.
IS>weak_ptr ссылается на экземпляр, которым владеет shared_ptr, однако не разделяет прав владения этим экземпляром. Это гарантирует, что если экземпляр уже уничтожен, мы сможем это надёжно и безопасно проверить.
Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.
В статье я умышленно не рассматривал вопросы, связанные с работой в многопоточной среде, чтобы не усложнять тему.
Возможно, в следующей версии статьи я исправлю этот недостаток.
Здравствуйте, Igor Semenov, Вы писали:
IS>Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>>Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.
IS>В статье я умышленно не рассматривал вопросы, связанные с работой в многопоточной среде, чтобы не усложнять тему. IS>Возможно, в следующей версии статьи я исправлю этот недостаток.
Актуальна ли статья?
По моем даже те кто буст толком не знает, уж смартпоинтеры то точно юзает
OE>Здравствуйте, Kirikaza, Вы писали:
K>>Выровняйте код, пожалуйста. А то его вид отпугнёт и так немногочисленных увлечённых С++. =) OE>как только разберемся чего его так корежит
Простите за ханжество, но мне лично кажется, что статья скажем слегка несвоевременна. Т.е. понятно, что всегда будут новички, которые не знают о перечисленных типах указателей, но, если серьёзно, то мне кажется, что действительно стоящая статья помимо пережёвывания давно известных методик (уж что-что, а "умные указатели" не описывал только ленивый — почти все современные авторы книг об этом трубили) должна приносить что-то новое.
Вот когда это дело ("умные указатели") только начиналось, тогда взять и исследовать их поведение, да написать подобную статью, было действительно стоящим делом. А описать своими словами давно известное многим — да, не плохо, может даже хорошо, но...
П.С.
Заметьте, я не говорил ничего вроде "статья никуда не годится", "плохо" или что-то в этом роде. Написано грамотно, автор воды не лил (к счастью явно не была использована "техника Шилдта/Зверька" — навалять много текста, чтобы дороже или круче вышло ), новичкам вероятно (если им будет влом читать стоящие книги Йосюттиса, Карлсона или help с www.boost.org) пригодится.
Это просто маленькое замечание, не более.