Поделиться через


shared_ptr Class

Создание ссылок подсчитанное интеллектуального указателя на динамически выделенного объекта.

template<class Ty>
   class shared_ptr {
public:
    typedef Ty element_type;

    shared_ptr();
    shared_ptr(nullptr_t); 
    shared_ptr(const shared_ptr& sp);
    shared_ptr(shared_ptr&& sp);
    template<class Other>
        explicit shared_ptr(Other * ptr);
    template<class Other, class D>
        shared_ptr(Other * ptr, D dtor);
    template<class D>
        shared_ptr(nullptr_t, D dtor);
    template<class Other, class D, class A>
        shared_ptr(Other *ptr, D dtor, A alloc);
    template<class D, class A>
        shared_ptr(nullptr_t, D dtor, A alloc);
    template<class Other>
        shared_ptr(const shared_ptr<Other>& sp);
    template<class Other>
        shared_ptr(const shared_ptr<Other>&& sp);
    template<class Other>
        explicit shared_ptr(const weak_ptr<Other>& wp);
    template<class Other>
        shared_ptr(auto_ptr<Other>& ap);
    template<class Other, class D>
        shared_ptr(unique_ptr<Other, D>&& up);
    template<class Other>
        shared_ptr(const shared_ptr<Other>& sp, Ty *ptr);
    ~shared_ptr();
    shared_ptr& operator=(const shared_ptr& sp);
    template<class Other> 
        shared_ptr& operator=(const shared_ptr<Other>& sp);
    shared_ptr& operator=(shared_ptr&& sp);
    template<class Other> 
        shared_ptr& operator=(shared_ptr<Other>&& sp);
    template<class Other> 
        shared_ptr& operator=(auto_ptr< Other >&& ap);
    template <class Other, class D> 
        shared_ptr& operator=(const unique_ptr< Other, D>& up) = delete;
    template <class Other, class D>
        shared_ptr& operator=(unique_ptr<Other, D>&& up);
    void swap(shared_ptr& sp);
    void reset();
    template<class Other>
        void reset(Other *ptr);
    template<class Other, class D>
        void reset(Other *ptr, D dtor);
    template<class Other, class D, class A>
        void reset(Other *ptr, D dtor, A alloc);
    Ty *get() const;
    Ty& operator*() const;
    Ty *operator->() const;
    long use_count() const;
    bool unique() const;
    operator bool() const;

    template<class Other>
        bool owner_before(shared_ptr<Other> const& ptr) const;
    template<class Other>
        bool owner_before(weak_ptr<Other> const& ptr) const;
    template<class D, class Ty> 
        D* get_deleter(shared_ptr<Ty> const& ptr);
};

Параметры

  • Ty
    Тип управляемого создания общего указателя.

  • Other
    Тип управляемого указателем аргумента.

  • ptr
    Указатель, который необходимо скопировать.

  • D
    Тип deleter.

  • A
    Тип распределителя.

  • dtor
    Deleter.

  • alloc
    Распределитель.

  • sp
    Интеллектуального указателя, чтобы скопировать или переместить.

  • wp
    Предоставляет указатель, который необходимо скопировать или переместить.

  • ap
    Auto указатель, который необходимо скопировать или переместить.

  • up
    Уникальный указатель, который нужно переместить.

Заметки

Класс шаблона описание объекта, использующего ссылку со счетчиком управлять ресурсами.Объект shared_ptr представляет навести указатель на ресурс, он имеет или содержит указатель.Ресурс может иметься более чем одним объектом shared_ptr; когда последний объект shared_ptr, имеющий указанный ресурс разрушается, ресурс удаленного.

shared_ptr. останавливает иметь ресурс при переподчинен или возврата.

Аргумент Ty может быть шаблона функции-членами неполного типа, если не указано иное для некоторых.

Когда объект shared_ptr<Ty> формируется из указателя ресурса из типа G* или shared_ptr<G>, тип указателя G* должен быть преобразуемым к Ty*.Если это не так, то код не будет компилироваться.Например:

class F {};
class G : public F {};

shared_ptr<G> sp0(new G);   // okay, template parameter G and argument G*
shared_ptr<G> sp1(sp0);     // okay, template parameter G and argument shared_ptr<G>
shared_ptr<F> sp2(new G);   // okay, G* convertible to F*
shared_ptr<F> sp3(sp0);     // okay, template parameter F and argument shared_ptr<G>
shared_ptr<F> sp4(sp2);     // okay, template parameter F and argument shared_ptr<F>
shared_ptr<int> sp4(new G); // error, G* not convertible to int*
shared_ptr<int> sp5(sp2);   // error, template parameter int and argument shared_ptr<F>

Объект shared_ptr имеет ресурса:

  • если было создано с указателем на этот ресурс,

  • если было создано из объекта shared_ptr, который имеет ресурс,

  • если было создано из объекта weak_ptr Class, на который указывает на этот ресурс или

  • если владелец этого ресурса, присвоенное в него или с помощью shared_ptr::operator= или путем вызова функции-члена shared_ptr::reset.

Объекты shared_ptr, иметь общую папку ресурса блок элемента управления.Блок элемента управления содержит:

  • количество объектов shared_ptr, которые имеют ресурс,

  • количество объектов weak_ptr, указывающих на ресурс,

  • deleter для ресурсов, если он есть,

  • пользовательский распределитель блока для элемента управления, если он есть.

Объект shared_ptr, который инициализируется с помощью пустых указателей имеет блок элемента управления и не является пустым.После выпусков объекта shared_ptr ресурс, он больше не имеет этот ресурс.После выпусков объекта weak_ptr ресурс, он больше не указывает к этому ресурсу.

Если количество объектов shared_ptr, ресурс будет иметь ноль, ресурс освобождается или, удалите его или путем передачи его адрес в deleter, зависит от способа создания исходного владение ресурса.Если количество объектов shared_ptr, иметь ресурс ноль и число объектов weak_ptr, указывающих к этому ресурсу ноль, блок элемента управления удаленного, используя пользовательский распределитель блока для элемента управления, если он есть.

Пустой объект shared_ptr не содержит ресурсы и не имеет блок элемента управления.

Deleter объект функции, который содержит функцию-член operator().Его тип должен быть копией constructible и его конструктор копий и деструктор не должны вызывать исключения.Он принимает один параметр, объект для удаления.

Некоторые функции принимают список аргументов, определяющий свойства результирующего объекта shared_ptr<Ty> или объекта weak_ptr<Ty>.Можно определить такой список аргументов несколькими способами:

нет аргументов -- получившийся объект пустой объект shared_ptr или пустой объект weak_ptr.

ptr -- указатель типа Other* к ресурсу, который требуется управление.Ty должно быть переполнен типом.Если функция завершается с ошибкой, то (поскольку блок элемента управления нельзя выбрать) он вычисляет выражение delete ptr.

ptr, dtor -- указатель типа Other* к ресурсу, который требуется управление и deleter для этого ресурса.Если функция завершается с ошибкой (поскольку блок элемента управления нельзя выбрать), он вызывает метод dtor(ptr), который должен определить хорошо.

ptr, dtor, alloc -- указатель типа Other* к ресурсу, который требуется управление, deleter для этого ресурса и распределитель для управления любое хранилище, которое необходимо для выделения и освобождения.Если функция завершается с ошибкой, то (поскольку блок элемента управления нельзя выбрать) вызывается dtor(ptr), который должен определить хорошо.

sp -- объект shared_ptr<Other>, содержащий ресурс, который нужно управлять.

wp -- объект weak_ptr<Other>, указывающий на ресурс, который нужно управлять.

ap -- объект auto_ptr<Other>, который содержит указатель на ресурс, который нужно управлять.Если функция завершается успешно, то она вызывает функцию ap.release(); в противном случае она оставляет неизменной ap.

Во всех случаях тип указателя Other* должен быть преобразуемым к Ty*.

Потокобезопасность

Несколько потоков могут читать и записывать различные объекты shared_ptr одновременно, даже если объекты копии, совместно использующих владельца.

Члены

Bb982026.collapse_all(ru-ru,VS.110).gifКонструкторы

shared_ptr::shared_ptr

Конструирует shared_ptr.

shared_ptr::~shared_ptr

Удаляет shared_ptr.

Bb982026.collapse_all(ru-ru,VS.110).gifМетоды

shared_ptr::element_type

Тип элемента.

shared_ptr::get

Получает адрес другому ресурса.

shared_ptr::owner_before

Возвращает значение true, если данный объект shared_ptr приказано перед (или меньше), предоставляемым указателем.

shared_ptr::reset

Ресурс Replace имеемый.

shared_ptr::swap

Обмен 2 объекта shared_ptr.

shared_ptr::unique

Если тесты имеемый ресурс уникальны.

shared_ptr::use_count

Подсчитывает количество владельцев ресурса.

Bb982026.collapse_all(ru-ru,VS.110).gifОператоры

shared_ptr::operator boolean-type

Если тесты имеемый ресурса существует.

shared_ptr::operator*

Получает значение параметра.

shared_ptr::operator=

Заменяет имеемый ресурс.

shared_ptr::operator->

Получает указатель указанному значению.

Требования

Заголовок: <memory>

Пространство имен: std

См. также

Ссылки

weak_ptr Class

Потокобезопасность в стандартной библиотеке C++

Другие ресурсы

Члены <память>