Skip to content

Latest commit

 

History

History
96 lines (73 loc) · 3.07 KB

enable-shared-from-this-class.md

File metadata and controls

96 lines (73 loc) · 3.07 KB
description title ms.date f1_keywords helpviewer_keywords ms.assetid
Learn more about: enable_shared_from_this Class
enable_shared_from_this Class
11/04/2016
memory/std::enable_shared_from_this
enable_shared_from_this class
enable_shared_from_this
9237603d-22e2-421f-b070-838ac006baf5

enable_shared_from_this Class

Helps generate a shared_ptr.

Syntax

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

Parameters

Ty
The type controlled by the shared pointer.

Remarks

Objects derived from enable_shared_from_this can use the shared_from_this methods in member functions to create shared_ptr owners of the instance that share ownership with existing shared_ptr owners. Otherwise, if you create a new shared_ptr by using this, it is distinct from existing shared_ptr owners, which can lead to invalid references or cause the object to be deleted more than once.

The constructors, destructor, and assignment operator are protected to help prevent accidental misuse. The template argument type Ty must be the type of the derived class.

For an example of usage, see enable_shared_from_this::shared_from_this.

shared_from_this

Generates a shared_ptr that shares ownership of the instance with existing shared_ptr owners.

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

Remarks

When you derive objects from the enable_shared_from_this base class, the shared_from_this template member functions return a shared_ptr Class object that shares ownership of this instance with existing shared_ptr owners. Otherwise, if you create a new shared_ptr from this, it is distinct from existing shared_ptr owners, which can lead to invalid references or cause the object to be deleted more than once. The behavior is undefined if you call shared_from_this on an instance that is not already owned by a shared_ptr object.

Example

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