Пространства имён
Варианты
Действия

std::shared_ptr::shared_ptr

Материал из cppreference.com
< cpp‎ | memory‎ | shared ptr

 
 
 
 
 
constexpr shared_ptr();
(1)
template< class Y >
explicit shared_ptr( Y* ptr );
(2)
template< class Y, class Deleter >
shared_ptr( Y* ptr, Deleter d );
(3)
template< class Y, class Deleter, class Alloc >
shared_ptr( Y* ptr, Deleter d, Alloc alloc );
(4)
constexpr shared_ptr( std::nullptr_t );
(5)
template< class Deleter >
shared_ptr( std::nullptr_t, Deleter d );
(6)
template< class Deleter, class Alloc >
shared_ptr( std::nullptr_t, Deleter d, Alloc alloc );
(7)
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
(8)
shared_ptr( const shared_ptr& r );
(9)
template< class Y >
shared_ptr( const shared_ptr<Y>& r );
(9)
shared_ptr( shared_ptr&& r );
(10)
template< class Y >
shared_ptr( shared_ptr<Y>&& r );
(10)
template< class Y >
explicit shared_ptr( const std::weak_ptr<Y>& r );
(11)
template< class Y >
shared_ptr( std::auto_ptr<Y>&& r );
(12)
template< class Y, class Deleter >
shared_ptr( std::unique_ptr<Y,Deleter>&& r );
(13)
Создает новые shared_ptr из различных типов указателей, которые относятся к объекту управления. Дополнительно Deleter d могут быть поставлены, который в дальнейшем используется для уничтожения объекта, когда не shared_ptr объектов его владельцем. По умолчанию, удалить выражение выражение используется в качестве Deleter. Правильное выражение delete соответствующего типа поставляются всегда выбирается, это является причиной, почему конструкторы реализованы в виде шаблонов с помощью отдельного Y параметра.
Оригинал:
Constructs new shared_ptr from a variety of pointer types that refer to an object to manage. Optional deleter d can be supplied, which is later used to destroy the object when no shared_ptr objects own it. By default, удалить выражение expression is used as deleter. Proper delete expression corresponding to the supplied type is always selected, this is the reason why the constructors are implemented as templates using a separate parameter Y.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Если объект, на который указывает ptr уже владеет некоторыми общими указатель, конструктор приводит к неопределенному поведению.
Оригинал:
If the object pointed to by ptr is already owned by some shared pointer, the constructor results in undefined behavior.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
1)
Конструктор по умолчанию создает shared_ptr, не управляемого объекта, т.е. пустую shared_ptr
Оригинал:
Default constructor constructs a shared_ptr with no managed object, i.e. empty shared_ptr
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2-4)
Создает shared_ptr с ptr как управляемого объекта. Y должна быть полная типа и неявно преобразуются в T. Дополнительно:
Оригинал:
Constructs a shared_ptr with ptr as the managed object. Y must be a complete type and implicitly convertible to T. Additionally:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
Использует удалить выражение, как Deleter. Допустимое удаление должно быть доступно, то есть delete ptr должны быть хорошо сформированы, имеют четко определенные поведение и не бросать исключения.
Оригинал:
Uses the delete expression as the deleter. A valid delete expression must be available, i.e. delete ptr must be well formed, have well-defined behavior and not throw any exceptions.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
Использование указанного d Deleter как Deleter. Deleter должны вызываться для типа T, т.е. d(ptr) должны быть хорошо сформированы, имеют четко определенные поведение и не бросать исключения. Deleter должны быть CopyConstructible.
Оригинал:
Uses the specified deleter d as the deleter. Deleter must be callable for the type T, i.e. d(ptr) must be well formed, have well-defined behavior and not throw any exceptions. Deleter must be CopyConstructible.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
То же, что (3), но дополнительно использует копию alloc для распределения данных для внутреннего пользования. Alloc должны быть Allocator. Конструктор копирования и деструктор не должны выбрасывать исключения.
Оригинал:
Same as (3), but additionally uses a copy of alloc for allocation of data for internal use. Alloc must be a Allocator. The copy constructor and destructor must not throw exceptions.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5-7)
По аналогии с (2), (3), (4) соответственно, но строит shared_ptr, не управляемого объекта, т.е. пустую shared_ptr.
Оригинал:
Analogous to (2), (3), (4) respectively, but constructs a shared_ptr with no managed object, i.e. empty shared_ptr.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
8)
Создает shared_ptr которая разделяет владения информацией с r, но держит связаны и неуправляемый указатель ptr. Даже если это shared_ptr является последним из группы, чтобы выйти из области видимости, он будет вызывать деструктор для объекта, первоначально управляется r. Однако, называя get() на этом всегда будет возвращать копию ptr. Это ответственность программиста, чтобы убедиться, что это ptr остается действительным до тех пор, пока это shared_ptr существует, например, в типичных случаях использования там, где ptr является членом объект, управляемый r или псевдоним (например, потупив) из r.get()
Оригинал:
Constructs a shared_ptr which shares ownership information with r, but holds an unrelated and unmanaged pointer ptr. Even if this shared_ptr is the last of the group to go out of scope, it will call the destructor for the object originally managed by r. However, calling get() on this will always return a copy of ptr. It is the responsibility of the programmer to make sure that this ptr remains valid as long as this shared_ptr exists, such as in the typical use cases where ptr is a member of the object managed by r or is an alias (e.g., downcast) of r.get()
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
9)
Создает shared_ptr которая разделяет право собственности на объект, управляемый r. Если r управляет не объект, *this управляет ни один объект не слишком. Шаблонный перегрузки не участвует в разрешении перегрузки, если Y* не неявно преобразуются в T*.
Оригинал:
Constructs a shared_ptr which shares ownership of the object managed by r. If r manages no object, *this manages no object too. The templated overload doesn't participate in the overload resolution if Y* is not implicitly convertible to T*.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
10)
Move-строит shared_ptr от r. После того, как строительство, *this содержит копию предыдущего состояния r, r пуст. Шаблонный перегрузки не участвует в разрешении перегрузки, если Y* не неявно преобразуются в T*.
Оригинал:
Move-constructs a shared_ptr from r. After the construction, *this contains a copy of the previous state of r, r is empty. The templated overload doesn't participate in the overload resolution if Y* is not implicitly convertible to T*.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
11)
Создает shared_ptr которая разделяет право собственности на объект, управляемый r. Y* должны быть конвертированы в T*. Обратите внимание, что r.lock() могут быть использованы для той же цели: разница в том, что этот конструктор генерирует исключение, если аргумент пустой, в то время как std::weak_ptr<T>::lock() создает пустой std::shared_ptr в таком случае.
Оригинал:
Constructs a shared_ptr which shares ownership of the object managed by r. Y* must be convertible to T*. Note that r.lock() may be used for the same purpose: the difference is that this constructor throws an exception if the argument is empty, while std::weak_ptr<T>::lock() constructs an empty std::shared_ptr in that case.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
12)
Создает shared_ptr который хранит и владеет объектом, ранее принадлежавшей r. Y* должны быть конвертированы в T*. После завершения строительных работ, r пусто.
Оригинал:
Constructs a shared_ptr that stores and owns the object formerly owned by r. Y* must be convertible to T*. After construction, r is empty.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
13)
Создает shared_ptr, который управляет объектом в настоящее время управляет r. Deleter, связанные с r сохранен для будущих удаления управляемого объекта. r управляет ни один объект после вызова. Y* должны быть конвертированы в T*.
Оригинал:
Constructs a shared_ptr which manages the object currently managed by r. The deleter associated to r is stored for future deletion of the managed object. r manages no object after the call. Y* must be convertible to T*.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Заметки

При построении из сырой указатель на объект типа, производного от std::enable_shared_from_this, конструкторы shared_ptr обнаружить другие владельцы объектов через слабые ссылки хранятся в том, что базовый класс и долевая собственность с ними, вместо того, предполагается, что объект не удалось.
Оригинал:
When constructing from a raw pointer to an object of a type derived from std::enable_shared_from_this, the constructors of shared_ptr detect other owners of the object through the weak reference stored in that base class and share ownership with them, instead of assuming that the object is not managed.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Параметры

ptr -
указатель на объект в управлении
Оригинал:
a pointer to an object to manage
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
d -
Deleter использовать, чтобы уничтожить объект
Оригинал:
a deleter to use to destroy the object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
alloc -
распределителя для использования в распределенных данных для внутреннего пользования
Оригинал:
an allocator to use for allocations of data for internal use
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
r -
другой смарт-указатель разделить собственность или приобретение собственности от
Оригинал:
another smart pointer to share the ownership to or acquire the ownership from
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Исключения

1)
noexcept-спецификация:  
noexcept
  (начиная с C++11)
2)
std::bad_alloc, если требуется дополнительная память не может быть получен. Может бросить осуществление определенных исключений для других ошибок. delete ptr называется, если происходит исключение.
Оригинал:
std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. delete ptr is called if an exception occurs.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3-4)
std::bad_alloc, если требуется дополнительная память не может быть получен. Может бросить осуществление определенных исключений для других ошибок. d(ptr) называется, если происходит исключение.
Оригинал:
std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. d(ptr) is called if an exception occurs.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
noexcept-спецификация:  
noexcept
  (начиная с C++11)
6-7)
std::bad_alloc, если требуется дополнительная память не может быть получен. Может бросить осуществление определенных исключений для других ошибок. Если исключение, d(ptr) выполняется.
Оригинал:
std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. If an exception is thrown, d(ptr) is executed.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
8-10)
noexcept-спецификация:  
noexcept
  (начиная с C++11)
11)
std::bad_weak_ptr если r.expired == true. Конструктор не имеет никакого эффекта в этом случае.
Оригинал:
std::bad_weak_ptr if r.expired == true. The constructor has no effect in this case.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
12)
std::bad_alloc, если требуется дополнительная память не может быть получен. Может бросить осуществление определенных исключений для других ошибок. Этот конструктор не имеет никакого эффекта, если происходит исключение.
Оригинал:
std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. This constructor has no effect if an exception occurs.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
13)
Если исключение, конструктор не имеет эффекта.
Оригинал:
If an exception is thrown, the constructor has no effects.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Пример

#include <memory>
#include <iostream>
 
struct Foo {
    Foo() { std::cout << "Foo...\n"; }
    ~Foo() { std::cout << "~Foo...\n"; }
};
 
struct D {
    void operator()(Foo* p) const {
        std::cout << "Call delete for Foo object...\n";
        delete p;
    }
};
 
int main()
{
    // constructor with no managed object
    std::shared_ptr<Foo> sh1;
 
    // constructor with object
    std::shared_ptr<Foo> sh2(new Foo);
    std::shared_ptr<Foo> sh3(sh2);
    std::cout << sh2.use_count() << '\n';
    std::cout << sh3.use_count() << '\n';
 
    //constructor with object and deleter
    std::shared_ptr<Foo> sh4(new Foo, D());
}

Вывод:

Foo...
2
2
Foo...
Call delete for Foo object...
~Foo...
~Foo...

[править] См. также

создает общий указатель, который управляет новый объект
Оригинал:
creates a shared pointer that manages a new object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
создает общий указатель, который управляет новый объект выделяется использованием распределителя
Оригинал:
creates a shared pointer that manages a new object allocated using an allocator
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]