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

make_shared and allocate_shared

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

make_shared and allocate_shared function templates

Введение
Синопсис
Свободные функции
Пример

Введение

Последовательное использование<shared_ptr>может устранить необходимость использования явного<delete>, но только он не оказывает поддержки в избегании явного<delete>.<new>. Повторялись запросы пользователей о фабричной функции, создающей объект данного типа и возвращающей ему<shared_ptr>. Помимо удобства и стиля, такая функция также безопасна и значительно быстрее, потому что она может использовать одно распределение как для объекта, так и для соответствующего блока управления, устраняя значительную часть строительных накладных расходов. Это устраняет одну из основных жалоб на эффективность<shared_ptr>.

Файл заголовкапредоставляет семейство перегруженных шаблонов функций<make_shared>и<allocate_shared>для удовлетворения этой потребности.<make_shared>использует глобального оператора<new>для выделения памяти, в то время как<allocate_shared>использует выделенный пользователем распределитель, позволяющий более точно контролировать.

Обоснование выбора имени<make_shared>состоит в том, что выражение<make_shared<Widget>()>может быть прочитано вслух и передает намеченный смысл.

Synopsis

namespace boost {
  template<typename T> class shared_ptr;
  template<typename T>
    shared_ptr<T> make_shared();
  template<typename T, typename A>
    shared_ptr<T> allocate_shared( A const & );
#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )    // C++0x prototypes
  template<typename T, typename... Args>
    shared_ptr<T> make_shared( Args && ... args );
  template<typename T, typename A, typename... Args>
    shared_ptr<T> allocate_shared( A const & a, Args && ... args );
#else // no C++0X support
  template<typename T, typename Arg1 >
    shared_ptr<T> make_shared( Arg1 const & arg1 );
  template<typename T, typename Arg1, typename Arg2 >
    shared_ptr<T> make_shared( Arg1 const & arg1, Arg2 const & arg2 );
// ...
  template<typename T, typename Arg1, typename Arg2, ..., typename ArgN >
    shared_ptr<T> make_shared( Arg1 const & arg1, Arg2 const & arg2, ..., ArgN const & argN );
  template<typename T, typename A, typename Arg1 >
    shared_ptr<T> allocate_shared( A const & a, Arg1 const & arg1 );
  template<typename T, typename A, typename Arg1, typename Arg2 >
    shared_ptr<T> allocate_shared( Arg1 const & arg1, Arg2 const & arg2 );
// ...
  template<typename T, typename A, typename Arg1, typename Arg2, ..., typename ArgN >
    shared_ptr<T> allocate_shared( A const & a, Arg1 const & arg1, Arg2 const & arg2, ..., ArgN const & argN );
#endif
}

Free Functions

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

Постусловия:<get() != 0 && use_count() == 1>.

Броски:<bad_alloc>или исключение, брошенное из<A::allocate>или конструктора<T>.

Примечания:Эта реализация выделяет память, необходимую для возвращаемого<shared_ptr>и объекта типа<T>в одном распределении. Это обеспечивает эффективность, эквивалентную навязчивому интеллектуальному указателю.

Прототипы, показанные выше, используются, если ваш компилятор поддерживает ссылки на rvalue и вариадные шаблоны. Они превосходно передают конструкторам<T>параметры<args>.

В противном случае реализация будет опираться на пересылку аргументов конструкторам<T>в качестве ссылок. Если вам нужно передать неконст-ссылку на конструктор<T>, вы можете сделать это, обернув параметр в вызове<boost::ref>. Кроме того, вы будете ограничены максимум 9 аргументами (не считая аргумента распределителя распределить).

Example

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.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:14:29/0.004019021987915/0