Последовательное использование<shared_ptr>может устранить необходимость использования явного<delete>, но только он не оказывает поддержки в избегании явного<delete>.<new>. Повторялись запросы пользователей о фабричной функции, создающей объект данного типа и возвращающей ему<shared_ptr>. Помимо удобства и стиля, такая функция также безопасна и значительно быстрее, потому что она может использовать одно распределение как для объекта, так и для соответствующего блока управления, устраняя значительную часть строительных накладных расходов. Это устраняет одну из основных жалоб на эффективность<shared_ptr>.
Файл заголовкапредоставляет семейство перегруженных шаблонов функций<make_shared>и<allocate_shared>для удовлетворения этой потребности.<make_shared>использует глобального оператора<new>для выделения памяти, в то время как<allocate_shared>использует выделенный пользователем распределитель, позволяющий более точно контролировать.
Обоснование выбора имени<make_shared>состоит в том, что выражение<make_shared<Widget>()>может быть прочитано вслух и передает намеченный смысл.
template<class T, class... Args>
shared_ptr<T> make_shared( Args && ... args );
template<class T, class A, class... Args>
shared_ptr<T> allocate_shared( A const & a, Args && ... args );
Требуется:Выражение<new( pv ) T( std::forward<Args>(args)... )>, где<pv>является<void*>указывающим на хранилище, пригодное для хранения объекта типа<T>, должно быть хорошо сформировано.<A>должен бытьРаспределитель, как описано в разделе 20.1.5Требования к Распределителямстандарта C++. Конструктор и разрушитель копий<A>не должен выбрасывать.
Эффекты:Выделяет память, подходящую для объекта типа<T>, и конструирует в ней объект посредством размещения нового выражения<new( pv ) T()>или<new( pv ) T( std::forward<Args>(args)... )>.<allocate_shared>использует копию<a>для выделения памяти. Если выпадает исключение, это не имеет никакого эффекта.
Возвращение:Пример<shared_ptr>, который хранит и владеет адресом вновь построенного объекта типа<T>.
Примечания:Эта реализация выделяет память, необходимую для возвращаемого<shared_ptr>и объекта типа<T>в одном распределении. Это обеспечивает эффективность, эквивалентную навязчивому интеллектуальному указателю.
Прототипы, показанные выше, используются, если ваш компилятор поддерживает ссылки на rvalue и вариадные шаблоны. Они превосходно передают конструкторам<T>параметры<args>.
В противном случае реализация будет опираться на пересылку аргументов конструкторам<T>в качестве ссылок. Если вам нужно передать неконст-ссылку на конструктор<T>, вы можете сделать это, обернув параметр в вызове<boost::ref>. Кроме того, вы будете ограничены максимум 9 аргументами (не считая аргумента распределителя распределить).
boost::shared_ptr<std::string> x = boost::make_shared<std::string>("hello, world!");
std::cout << *x;
$Date$
Авторское право 2008 Питер Димов. Авторское право 2008 Фрэнк Мори Хесс. Распространяется под лицензией Boost Software License, версия 1.0. См. сопроводительный файлLICENSE_1_0.txtили копию наhttp://www.boost.org/LICENSE_1_0.txt
Статья make_shared and allocate_shared раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.