Класс enable_shared_from_this
Помогает сформировать shared_ptr
.
Синтаксис
class enable_shared_from_this {
public:
shared_ptr<Ty>
shared_from_this();
shared_ptr<const Ty> shared_from_this() const;
weak_ptr<T> weak_from_this() noexcept;
weak_ptr<T const> weak_from_this() const noexcept;
protected:
enable_shared_from_this();
enable_shared_from_this(const enable_shared_from_this&);
enable_shared_from_this& operator=(const enable_shared_from_this&);
~enable_shared_from_this();
};
Параметры
Ty
Тип, управляемый общим указателем.
Замечания
Объекты, производные от enable_shared_from_this
, могут использовать методы shared_from_this
в функциях-членах для создания владельцев shared_ptr экземпляра, которые владеют им совместно с существующими владельцами shared_ptr
. В противном случае, если создается новый shared_ptr
с помощью this
, он отличается от существующих владельцев shared_ptr
, что может привести к недействительным ссылкам или к тому, что объект будет удален несколько раз.
Во избежание случайного неправильного использования конструктор, деструктор и оператор присваивания защищены. Тип аргумента шаблона Ty должен быть типом производного класса.
Пример использования см. в разделе enable_shared_from_this::shared_from_this.
shared_from_this
Создает shared_ptr
, который владеет экземпляром совместно с существующими владельцами shared_ptr
.
shared_ptr<T> shared_from_this();
shared_ptr<const T> shared_from_this() const;
Замечания
При получении объектов из базового класса enable_shared_from_this
функции члена шаблона shared_from_this
возвращают объект класса shared_ptr, владеющий данным экземпляром совместно с существующими владельцами shared_ptr
. В противном случае, если создается новый shared_ptr
из this
, он отличается от существующих владельцев shared_ptr
, что может привести к недействительным ссылкам или к тому, что объект будет удален несколько раз. Поведение будет неопределенным, если вызвать shared_from_this
в экземпляре, которым еще не владеет объект shared_ptr
.
Пример
// std_memory_shared_from_this.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
using namespace std;
struct base : public std::enable_shared_from_this<base>
{
int val;
shared_ptr<base> share_more()
{
return shared_from_this();
}
};
int main()
{
auto sp1 = make_shared<base>();
auto sp2 = sp1->share_more();
sp1->val = 3;
cout << "sp2->val == " << sp2->val << endl;
return 0;
}
sp2->val == 3
weak_from_this
weak_ptr<T> weak_from_this() noexcept;
weak_ptr<T const> weak_from_this() const noexcept;