Обсуждениеshared_arrayшаблон класса хранит указатель на динамически выделенный массив. (Динамически выделенный массив выделен с помощью C++)Новый []Выражение. Указанный объект гарантированно удаляется, когда последнийshared_array, указывающий на него, уничтожается или сбрасывается.
КаждыйподелитсясоответствуетCopyConstructibleиПрименимыетребования Стандартной библиотеки C++, и поэтому могут использоваться в стандартных библиотечных контейнерах. Операторы сравнения поставляются таким образом, чтобыshared_arrayработал с ассоциативными контейнерами стандартной библиотеки.
Обычноshared_arrayне может правильно удерживать указатель на объект, который был выделен с не-array формойнового. См.shared_ptrдля этого использования.
Поскольку реализация использует подсчет ссылок, циклыэкземпляров shared_arrayне будут восстановлены. Например, еслиmain()удерживаетshared_arrayдоA, который прямо или косвенно удерживаетshared_arrayобратно доA,Aколичество использования будет 2. Уничтожение оригиналаshared_arrayоставитAболтающимся с количеством использования 1.
shared_ptrtostd::vectorявляется альтернативойshared_array, который немного тяжелее, но гораздо более гибкий.
Шаблон класса параметризован наТ, тип объекта, на который указывается.Tдолжен соответствовать общим требованиям.
Synopsis
namespace boost {
template<class T> class shared_array {
public:
typedef T element_type;
explicit shared_array(T * p = 0);
template<class D> shared_array(T * p, D d);
~shared_array(); // never throws
shared_array(shared_array const & r); // never throws
shared_array & operator=(shared_array const & r); // never throws
void reset(T * p = 0);
template<class D> void reset(T * p, D d);
T & operator[](std::ptrdiff_t i) const; // never throws
T * get() const; // never throws
bool unique() const; // never throws
long use_count() const; // never throws
operator unspecified-bool-type() const; // never throws
void swap(shared_array<T> & b); // never throws
};
template<class T>
bool operator==(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<class T>
bool operator!=(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<class T>
bool operator<(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<class T> void swap(shared_array<T> & a, shared_array<T> & b); // never throws
}
Конструируетshared_array, сохраняя копиюp, которая должна быть указателем на массив, который был выделен через C++новый []выражение или быть 0. После этогочисло использованияравно 1 (даже если p == 0; см.~shared_array). Единственным исключением, которое может быть брошено этим конструктором, являетсяstd::bad_alloc. Если же в них есть что-то общее, то,.
template<class D> shared_array(T * p, D d);
Построенshared_array, хранящий копиюpиd. После этогоиспользовать счетявляется 1.DКопировал конструктор и разрушитель не должен бросать. Когда приходит время удалить массив, на который указываетp, объектdиспользуется в утвержденииd(p). Ссылка на объектdс параметромpтаким образом не должна бросаться. Единственным исключением, которое может быть брошено этим конструктором, являетсяstd::bad_alloc. Если же в этом случае речь идет о,.
shared_array(shared_array const & r); // never throws
Создаетshared_array, как бы сохраняя копию указателя, хранящегося вr. После этогоиспользуйте количестводля всех копий на 1 больше, чем начальное количество использования.
,,. Затем, если число использования равно 0, удаляет массив, на который указывает сохраненный указатель. Обратите внимание, чтоудалите []на указателе со значением 0 безвредно.Tне обязательно должен быть полным типом. Гарантия того, что это не делает исключений, зависит от требования, чтобы деструктор удаленного объекта не выбрасывал исключений. Умный указательОбщие требования.
Конструирует новыйshared_array, как описановыше, затем заменяет этотshared_arrayна новый, уничтожая замененный объект. Единственным исключением, которое может быть брошено, являетсяstd::bad_alloc. Если же в этом случае возникает необходимость, то.
template<class D> void reset(T * p, D d);
Конструирует новыйshared_array, как описановыше, затем заменяет этотshared_arrayна новый, уничтожая замененный объект.Dконструктор копий не должен бросать. Единственным исключением, которое может быть брошено, являетсяstd::bad_alloc. Если же выпадает исключение, тоd(p)вызывается.
T & operator[](std::ptrdiff_t i) const; // never throws
Возвращает ссылку на элементiмассива, на который указывает хранимый указатель. Поведение не определено и почти наверняка нежелательно, если сохраненный указатель равен 0, или еслиiменьше 0 или больше или равно количеству элементов в массиве.
Возвращается истинным, если ни один другойshared_arrayне является совместной собственностью хранимого указателя, ложным в противном случае.Tне обязательно должен быть полным типом. Умный указательОбщие требования.
Возвращает числоshared_arrayобъектов, совместно владеющих сохраненным указателем.Tне обязательно должен быть полным типом. Умный указательОбщие требования.
Посколькуuse_countне обязательно эффективен для реализации для реализацииshared_array, которые не используют явное количество ссылок, он может быть удален из какой-либо будущей версии. Таким образом, он должен использоваться только для отладки, а не для производственного кода.
template<class T>
bool operator==(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<class T>
bool operator!=(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<class T>
bool operator<(shared_array<T> const & a, shared_array<T> const & b); // never throws
Сравните сохраненные указатели двух умных указателей.Тне обязательно должен быть полным типом. Умный указательОбщие требования.
Оператор<перегрузка обеспечивается для определения порядка так, чтобыshared_arrayобъекты могли использоваться в ассоциативных контейнерах, таких какstd::map. В реализации используетсяstd::lessдля выполнения сравнения. Это гарантирует, что сравнение обрабатывается правильно, поскольку стандартные мандаты, что реляционные операции на указателях не определены (5.9 [expr.rel] параграф 2), ноstd::less<>на указателях, четко определены (20.3.3 [lib.comparisons] пункт 8).
template<class T>
void swap(shared_array<T> & a, shared_array<T> & b) // never throws
a.swap(b). Соответствует интерфейсуstd::swap. Предоставляется в качестве помощи для общего программирования.
$Date$
Авторское право 1999 Грег Колвин и Беман Доуз. Авторское право 2002 Дарин Адлер. Авторское право 2002-2005 годы Питер Димов. Распространяется под лицензией Boost Software License, версия 1.0. См. сопроводительный файлLICENSE_1_0.txtили копию наhttp://www.boost.org/LICENSE_1_0.txt
Статья shared_array раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.