scoped_ptrшаблон класса хранит указатель на динамически выделенный объект. (Динамически выделенные объекты выделены с помощью C++)новое выражение. Указанный объект гарантированно удаляется либо при уничтоженииscoped_ptr, либо посредством явногосброса.. Смотрите пример.
Шаблонscoped_ptrявляется простым решением для простых потребностей. Он обеспечивает базовую установку «приобретение ресурсов — это инициализация» без семантики совместного владения или передачи собственности. Как его название, так и применение семантики (будучинекопируемым) сигнализируют о его намерении сохранить право собственности исключительно в пределах текущей области. Поскольку этонекопируемое, это безопаснее, чемshared_ptrилиstd::auto_ptrдля указателей, которые не должны копироваться.
Посколькуscoped_ptrпрост, в его обычной реализации каждая операция так же быстра, как и для встроенного указателя, и у него больше нет места над головой, чем у встроенного указателя.
scoped_ptrне может использоваться в контейнерах стандартной библиотеки C++. Используйтеshared_ptr, если вам нужен умный указатель, который может.
scoped_ptrне может правильно удерживать указатель на динамически выделенном массиве. См.scoped_arrayдля этого использования.
Шаблон класса параметризован наТ, тип объекта, на который указывается.Tдолжен соответствовать общим требованиям.
Synopsis
namespace boost {
template<class T> class scoped_ptr : noncopyable {
public:
typedef T element_type;
explicit scoped_ptr(T * p = 0); // never throws
~scoped_ptr(); // never throws
void reset(T * p = 0); // never throws
T & operator*() const; // never throws
T * operator->() const; // never throws
T * get() const; // never throws
operator unspecified-bool-type() const; // never throws
void swap(scoped_ptr & b); // never throws
};
template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b); // never throws
}
Конструируетscoped_ptr, сохраняя копиюp, которая должна быть выделена через новое выражениеC++или быть 0.Tне обязательно должен быть полным типом. Умный указательОбщие требования.
Уничтожает объект, на который указывает сохраненный указатель, если таковой имеется, как если бы с помощьюудалить это->get().
Гарантия того, что это не делает исключений, зависит от требования, чтобы деструктор удаленного объекта не выбрасывал исключений. Умный указательОбщие требования.
Удалите объект, на который указывает сохраненный указатель, а затем сохраните копию p, которая должна была быть выделена через C++.новоевыражение или быть 0. Гарантия того, что это не делает исключений, зависит от требования, чтобы деструктор удаленного объекта не выбрасывал исключений. Умный указательОбщие требования.
Пример программы производит начало детской рифмы ребенка:
1
2
Buckle my shoe
Rationale
Основная причина использованияscoped_ptr, а неauto_ptrзаключается в том, чтобы дать читателям вашего кода знать, что вы намереваетесь применять «приобретение ресурсов является инициализацией» только для текущей области применения и не намерены передавать право собственности.
Вторичная причина для использованияscoped_ptrзаключается в том, чтобы помешать более позднему программисту технического обслуживания добавить функцию, которая передает право собственности, возвращаяauto_ptr, потому что программист технического обслуживания виделauto_ptr, и предполагаемое право собственности может быть безопасно передано.
Подумайте оboolvsint. Мы все знаем, что под одеяломboolобычно находитсяint. Действительно, некоторые возражали против включенияboolв стандарт C++ из-за этого. Но, кодируяbool, а неint, вы говорите своим читателям, каковы ваши намерения. То же самое сscoped_ptr; используя его, вы сигнализируете о намерении.
Было высказано предположение, чтоscoped_ptrэквивалентноstd::auto_ptr< T>const. Эдди Брей указал, однако, чтосбросне будет работать наstd::auto_ptrconst.
Одним из распространенных примененийscoped_ptrявляется реализация идиомы «ручка/тело» (также называемой pimpl), которая позволяет избежать раскрытия тела (реализации) в файле заголовка.
Q. Почемуscoped_ptrне имеет релиза()? A. При чтении исходного кода важно уметь делать выводы о поведении программы на основе используемых типов. Если быscoped_ptrимел(а) участник(а) выпуска, стало бы возможным передать право собственности на удерживаемый указатель, ослабляя его роль как способа ограничения ресурсного срока службы данным контекстом. Используйтеstd::auto_ptr, где требуется передача права собственности. (перенаправлено с «Dave Abrahams»)
Дата $
Авторское право 1999 Грег Колвин и Беман Доуз. Авторское право 2002 Дарин Адлер. Авторское право 2002-2005 годы Питер Димов. Распространяется под лицензией Boost Software License, версия 1.0. См. сопроводительный файлLICENSE_1_0.txtили копию наhttp://www.boost.org/LICENSE_1_0.txt
Статья scoped_ptr раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.