Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Smart Pointers

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Smart Pointers

Интродукции
Общие требования
Безопасность приема
Примечания
История и признания
Справочники

Introduction

Умные указатели - это объекты, которые хранят указатели на динамически распределенные (тяжелые) объекты. Они ведут себя так же, как встроенные указатели C++, за исключением того, что они автоматически удаляют объект, указанный в соответствующее время. Умные указатели особенно полезны перед лицом исключений, поскольку они обеспечивают надлежащее уничтожение динамически распределенных объектов. Они также могут использоваться для отслеживания динамически распределенных объектов, разделяемых несколькими владельцами.

Концептуально, умные указатели считаются владельцами объекта, на который указывают, и, следовательно, отвечают за удаление объекта, когда он больше не нужен.

Библиотека умных указателей предоставляет шесть шаблонов класса умных указателей:

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.

Common Requirements

Эти шаблоны класса умных указателей имеют параметр шаблона 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.

Rationale

Требования к T тщательно разработаны, чтобы максимизировать безопасность, но позволяют ручному телу (также называемому pimpl) и аналогичным идиомам. В этих идиомах умный указатель может появляться в переводческих единицах, где T является неполным типом. Это отделяет интерфейс от реализации и скрывает реализацию от переводческих единиц, которые просто используют интерфейс. Примеры, описанные в документации для конкретных умных указателей, иллюстрируют использование умных указателей в этих идиомах.

Обратите внимание, что scoped_ptr требует, чтобы T был полным типом во время уничтожения, но shared_ptr не имеет.

Exception Safety

Несколько функций в этих классах умных указателей определяются как имеющие «нет эффекта» или «нет эффекта, кроме такого-и-таких», если выбрасывается исключение. Это означает, что когда исключение выбрасывается объектом одного из этих классов, все состояние программы остается таким же, как и до вызова функции, в результате которого выбрасывается исключение. Это означает гарантию отсутствия обнаруживаемых побочных эффектов. Другие функции никогда не бросают исключений. Единственное исключение, когда-либо брошенное функциями, которые выбрасывают (предполагая T, соответствует общим требованиям), - это std::bad_alloc, и это выбрасывается только теми функциями, которые явно документируются как std::bad_alloc.

Exception-specifications

Исключения не используются; см. обоснование исключения.

Все шаблоны умных указателей содержат функции-члены, которые никогда не могут делать исключений, потому что они не бросают исключения сами по себе и не называют другие функции, которые могут бросить исключения. Эти члены обозначены комментарием: // никогда не бросает.

Функции, которые уничтожают объекты указанного типа, запрещаются выбрасывать исключения по общим требованиям.

History and Acknowledgements

Февраль 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. Вопросы осуществления вращались вокруг контрольного количества, которое должно быть сохранено, либо приложено к указанному объекту, либо отделено в другом месте. Каждый из этих вариантов имеет два основных варианта:

  • Share_ptr - дегенерирующий дегенерирующий элемент, дегенерирующий дегенерирующий элемент.
  • Косвенно-отрицательный: Share_ptr - дегентектор, е-помощник, , , , , , , , , , , , , , .
  • Добавлено: графа - отверстие, , , .
  • При непосредственном контакте: по отношению к оператору Н. Манипуляций.

Каждая техника реализации имеет преимущества и недостатки. Мы зашли так далеко, чтобы запустить различные сроки прямых и косвенных подходов, и обнаружили, что по крайней мере на чипах Intel Pentium было очень мало измеримых различий. Кевлин Хенни написал статью на «Техники тела». Dietmar Kühl предложил элегантный метод частичной специализации шаблонов, чтобы пользователи могли выбрать, какую реализацию они предпочитают, и это было также экспериментировано.Прямое отсоединенное: shared_ptr содержит указатель на объект и указатель на счетчик.

  • Непрямое отсоединение: 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 была добавлена удивительная семантика передачи собственности.

    References

    [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.




    Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



    :: Главная :: ::


    реклама


    ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
    Top.Mail.Ru

    Время компиляции файла: 2024-08-30 11:47:00
    2025-05-19 17:52:01/0.011532068252563/1