Condividi tramite


Classe enable_shared_from_this

Consente di generare un shared_ptr.

Sintassi

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();
};

Parametri

Ty
Tipo controllato dal puntatore condiviso.

Osservazioni:

Gli oggetti derivati da enable_shared_from_this possono usare i metodi shared_from_this nelle funzioni membro per creare proprietari shared_ptr dell'istanza che condividono la proprietà con proprietari shared_ptr esistenti. In caso contrario, se si crea un nuovo shared_ptr usando this, è diverso dai proprietari shared_ptr esistenti, il che può portare a riferimenti non validi o all'eliminazione di un oggetto più volte.

I costruttori, il distruttore e l'operatore di assegnazione sono protetti per evitare un uso improprio accidentale. Il tipo di argomento modello Ty deve essere il tipo della classe derivata.

Per un esempio di utilizzo, vedere enable_shared_from_this::shared_from_this.

shared_from_this

Genera un shared_ptr che condivide la proprietà dell'istanza con i proprietari shared_ptr esistenti.

shared_ptr<T> shared_from_this();
shared_ptr<const T> shared_from_this() const;

Osservazioni:

Quando si derivano oggetti dalla classe di base enable_shared_from_this, le funzioni membro del modello shared_from_this restituiscono un oggetto classe shared_ptr che condivide la proprietà di questa istanza con i proprietari shared_ptr esistenti. In caso contrario, se si crea un nuovo shared_ptr da this, è diverso dai proprietari shared_ptr esistenti, il che può portare a riferimenti non validi o all'eliminazione di un oggetto più volte. Il comportamento sarà indefinito se si chiama shared_from_this in un'istanza che non è già di proprietà di un oggetto shared_ptr.

Esempio

// 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;