◐ Shell
clean mode source ↗

std::shared_ptr::~shared_ptr — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

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

После уничтожения умные указатели, которые совместно владеют *this, если таковой имеется, возвращают use_count(), которое на единицу меньше, чем её предыдущее значение.

Примечание

В отличие от std::unique_ptr, средство удаления std::shared_ptr вызывается, даже если управляемый указатель равен нулю.

Пример

#include <memory>
#include <iostream>

struct S {
    S() { std::cout << "S::S()\n"; }
    ~S() { std::cout << "S::~S()\n"; }
    struct Deleter {
        void operator()(S* s) const {
            std::cout << "S::Deleter()\n";
            delete s;
        }
    };
};

int main()
{
    auto sp = std::shared_ptr<S>{ new S, S::Deleter{} };

    auto use_count = [&sp](char c) {
        std::cout << c << ") use_count(): " << sp.use_count() << '\n';
    };

    use_count('A');
    {
        auto sp2 = sp;
        use_count('B');
        {
            auto sp3 = sp;
            use_count('C');
        }
        use_count('D');
    }
    use_count('E');

//  sp.reset();
//  use_count('F'); // напечатает "F) use_count(): 0"
}

Вывод:

S::S()
A) use_count(): 1
B) use_count(): 2
C) use_count(): 3
D) use_count(): 2
E) use_count(): 1
S::Deleter()
S::~S()

Смотрите также