![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Smart PointersBoost , ,
|
scoped_ptr | Простое единоличное владение отдельными объектами. Некопируемый. | |
scoped_array | Простое единоличное владение массивами. Некопируемый. | |
shared_ptr | Объектная собственность, совместно используемая между несколькими указателями. | |
shared_array | Владение аррайом разделяется между несколькими указателями. | |
weak_ptr | Non-owning observers of an object owned by shared_ptr. | |
intrusive_ptr | Совместное владение объектами с встроенным исходным счетом. |
Эти шаблоны предназначены для дополнения шаблона std::auto_ptr.
Они являются примерами «приобретение ресурсов является инициализацией», описанной в «The C++ Programming Language», 3-м издании, Section 14.4, Resource Management.
Кроме того, библиотека умных указателей предоставляет эффективные заводские функции для создания умных указателей объектов:
make_shared, allocate_shared для объектов | Эффективное создание объектов shared_ptr . |
|
make_shared, allocate_shared для массивов | Эффективное создание shared_ptr массивов. |
|
make_unique | Создание объектов и массивов unique_ptr . |
Программа тестирования, smart_ptr_test.cpp, предоставляется для проверки правильной работы.
Страница на совместимость с более старыми версиями библиотеки умных указателей Boost описывает некоторые изменения с более ранних версий реализации умных указателей.
Страница на умные указатели будет интересна тем, кто интересуется вопросами производительности.
A page on smart pointer programming techniques lists
some advanced applications of shared_ptr
and weak_ptr
.
Эти шаблоны класса умных указателей имеют параметр шаблона T, который определяет тип объекта, на который указывает умный указатель. Поведение шаблонов умного указателя не определено, если деструктор или оператор удаляют для объектов типа T выбрасывают исключения.
T может быть неполным типом в точке заявления умного указателя. Если не указано иное, требуется, чтобы T был полным типом в точках мгновенных умных указателей. Осуществление необходимо для диагностики (относить как ошибку) всех нарушений этого требования, включая удаление неполного типа. См. описание шаблона функции checked_delete.
Note that shared_ptr does not have this restriction, as most of its member functions do not require T to be a complete type.
Требования к T тщательно разработаны, чтобы максимизировать безопасность, но позволяют ручному телу (также называемому pimpl) и аналогичным идиомам. В этих идиомах умный указатель может появляться в переводческих единицах, где T является неполным типом. Это отделяет интерфейс от реализации и скрывает реализацию от переводческих единиц, которые просто используют интерфейс. Примеры, описанные в документации для конкретных умных указателей, иллюстрируют использование умных указателей в этих идиомах.
Обратите внимание, что scoped_ptr требует, чтобы T был полным типом во время уничтожения, но shared_ptr не имеет.
Несколько функций в этих классах умных указателей определяются как имеющие «нет эффекта» или «нет эффекта, кроме такого-и-таких», если выбрасывается исключение. Это означает, что когда исключение выбрасывается объектом одного из этих классов, все состояние программы остается таким же, как и до вызова функции, в результате которого выбрасывается исключение. Это означает гарантию отсутствия обнаруживаемых побочных эффектов. Другие функции никогда не бросают исключений. Единственное исключение, когда-либо брошенное функциями, которые выбрасывают (предполагая T, соответствует общим требованиям), - это std::bad_alloc, и это выбрасывается только теми функциями, которые явно документируются как std::bad_alloc.
Исключения не используются; см. обоснование исключения.
Все шаблоны умных указателей содержат функции-члены, которые никогда не могут делать исключений, потому что они не бросают исключения сами по себе и не называют другие функции, которые могут бросить исключения. Эти члены обозначены комментарием: // никогда не бросает
.
Функции, которые уничтожают объекты указанного типа, запрещаются выбрасывать исключения по общим требованиям.
Февраль 2014. Глен Фернандес обновил перегрузки make_shared и allocate_shared, чтобы соответствовать спецификациям в стандартном документе C++. [D&F-14], и реализован make_unique для массивов и объектов. Питер Димов и Глен Фернандес обновили скалярные и массивные реализации, соответственно, для устранения стандартного библиотечного дефекта C++ 2070.
Ноябрь 2012 г. Глен Фернандес предоставил реализацию make_shared и allocate_shared для массивов. Они достигают единого выделения для массива, который может быть инициализирован с аргументами конструктора или списками инициализаторов, а также перегрузкой для инициализации по умолчанию и без инициализации значений. Дополнительные сведения см. на странице make_shared и allocate_shared для массивов.
January 2002. Питер Димов переработал все четыре класса, добавив функции, исправляя ошибки, и разделив их на четыре отдельных заголовка, и добавил weak_ptr. См. страницу совместимость для резюме изменений.
May 2001. Владимир Прус предложил потребовать полного типа уничтожения. Refinement эволюционировал в дискуссиях, включая Дэйва Абрахама, Грега Колвина, Бемана Доуса, Райнера Дайке, Питера Димова, Джона Маддока, Владимира Пруса, Шанкара Саи и других.
Ноябрь 1999. Darin Adler предоставил operator ==, operator !=, и std::swap и std::less специализации для общих типов.
Сентябрь 1999. Луис Коэльо предоставил shared_ptr::swap и shared_array::swap
May 1999. В апреле и мае 1999 года Валентин Боннар и Дэвид Абрахамс внесли ряд предложений, которые привели к многочисленным улучшениям.
Октябрь 1998. Беман Доус предложил возродить оригинальную семантику под названиями safe_ptr и counted_ptr, встреча Пера Андерссона, Мэтта Austern, Грега Колвина, Шона Корфилда, Пита Бекера, Нико Джосуттиса, Dietmar Kühl, Натана Майерса, Чичианг Вана и Джуди Уорда. Во время обсуждения были завершены четыре новых названия классов, было решено, что нет необходимости точно следовать интерфейсу std::auto_ptr, и были завершены различные подписи функций и семантика.
В течение следующих трех месяцев было рассмотрено несколько реализаций для shared_ptr и обсуждено в списке рассылки boost.org. Вопросы осуществления вращались вокруг контрольного количества, которое должно быть сохранено, либо приложено к указанному объекту, либо отделено в другом месте. Каждый из этих вариантов имеет два основных варианта:
Каждая техника реализации имеет преимущества и недостатки. Мы зашли так далеко, чтобы запустить различные сроки прямых и косвенных подходов, и обнаружили, что по крайней мере на чипах Intel Pentium было очень мало измеримых различий. Кевлин Хенни написал статью на «Техники тела». Dietmar Kühl предложил элегантный метод частичной специализации шаблонов, чтобы пользователи могли выбрать, какую реализацию они предпочитают, и это было также экспериментировано.Прямое отсоединенное: shared_ptr содержит указатель на объект и указатель на счетчик.
Each implementation technique has advantages and disadvantages. We went so far as to run various timings of the direct and indirect approaches, and found that at least on Intel Pentium chips there was very little measurable difference. Kevlin Henney provided a paper he wrote on "Counted Body Techniques." Dietmar Kühl suggested an elegant partial template specialization technique to allow users to choose which implementation they preferred, and that was also experimented with.[ORIG_END] -->
Но Грег Колвин и Джерри Шварц утверждали, что «параметризация будет препятствовать пользователям», и в итоге мы решили поставить только прямую реализацию.
Саммер, 1994. Грег Колвин предложил классам Комитета по стандартам C++ под названием auto_ptr и counted_ptr, которые были очень похожи на то, что мы сейчас называем scoped_ptr и shared_ptr. [Col-94] В одном из немногих случаев, когда рекомендации Рабочей группы Библиотеки не сопровождались полным комитетом, counted_ptr было отклонено, и к auto_ptr была добавлена удивительная семантика передачи собственности.
[D&F-14] Peter Dimov & Glen Fernandes, Расширение make_shared to Support Arrays, Revision 1, C++ Committee document N3870, January, 2014.
[Кол-94] Грегори Колвин, Исключения Safe Smart Pointers, документ комитета C++ 94-168/N0555, июль, 1994.
[E&D-94] John R. Ellis & David L. Detlefs, Safe, Efficient Garbage Collection for C++, Usenix Proceedings, February, 1994. Этот документ включает обширное обсуждение слабых указателей и обширную библиографию.
долл. США
Copyright 1999 Грег Колвин и Беман Доус. Copyright 2002 Darin Adler. Distributed under the Boost Software License, Version 1.0. LICENSE_1_0.txt или копия на http://www.boost.org/LICENSE_1_0.txt.
Статья Smart Pointers раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |