Шаблон класса scoped_array хранит указатель на динамически распределенный массив. (Динамически распределенные массивы распределены с помощью C++ new[]. Направленный массив гарантированно удаляется либо при разрушении scoped_array, либо через явный reset.
Шаблон scoped_array является простым решением для простых потребностей. Он обеспечивает базовое «приобретение ресурсов - инициализация», без семантики совместного владения или передачи собственности. Как его название, так и исполнение семантики (будь то некопируемой) сигнализируют о его намерении сохранить право собственности исключительно в пределах текущего объема. Поскольку он некопируемый, он безопаснее shared_array для указателей, которые не должны быть скопированы.
Потому что scoped_array настолько прост, что в своей обычной реализации каждая операция так же быстра, как встроенный указатель массива, и у него больше нет пространства над головой, что встроенный указатель массива.
Он не может использоваться в стандартных библиотечных контейнерах C++. См. shared_array, если scoped_array не соответствует вашим потребностям.
Он не может правильно держать указатель на один объект. См. scoped_ptr для этого использования.
std::vector является альтернативой scoped_array, которая является немного более тяжелой, но гораздо более гибкой. A boost::array - это альтернатива, которая не использует динамическое распределение.
Шаблон класса параметризирован на T, тип объекта, на который указывают. T должен соответствовать умному указателю общим требованиям.
Synopsis
namespace boost {
template<class T> class scoped_array : noncopyable {
public:
typedef T element_type;
explicit scoped_array(T * p = 0); // never throws
~scoped_array(); // never throws
void reset(T * p = 0); // never throws
T & operator[](std::ptrdiff_t i) const; // never throws
T * get() const; // never throws
operator unspecified-bool-type() const; // never throws
void swap(scoped_array & b); // never throws
};
template<class T> void swap(scoped_array<T> & a, scoped_array<T> & b); // never throws
}
Конструкция scoped_array, хранение копии p, которая должна быть выделена через C++ new[] выражение или быть 0.T не требуется полный тип. См. умный указатель общие требования.
Исключает массив, указанный сохраненным указателем. Обратите внимание, что delete [] на указателе с значением 0 безвреден. Гарантия того, что это не бросает исключений, зависит от требования, что деструкторы объектов удаленного массива не выбрасывают исключений. См. умный указатель общие требования.
Исключает массив, на который указывает сохраненный указатель, а затем сохраняет копию p, которая должна быть выделена через C++ new [] выражение или быть 0. Гарантия того, что это не бросает исключений, зависит от требования, чтобы деструкторы объектов удаленного массива не бросали исключений. См. умный указатель общие требования.
T & operator[](std::ptrdiff_t i) const; // never throws
Description Поведение не определено и почти наверняка нежелательно, если сохраненный указатель равен 0, или если i меньше 0 или больше или равно количеству элементов в массиве.
template<class T> void swap(scoped_array<T> & a, scoped_array<T> & b); // never throws
Эквивалент a.swap(b). Соответствует интерфейсу std::swap. Предоставляется в качестве помощи для общего программирования.
долл. США
Copyright 1999 Грег Колвин и Беман Доус. Авторское право 2002 Darin Adler. Copyright 2002-2005 Питер Димов. Distributed under the Boost Software License, Version 1.0. LICENSE_1_0.txt или копия на http://www.boost.org/LICENSE_1_0.txt.
Статья scoped_array раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.