Spec-Zone.ru › C++

std::shared_ptr<T>::~shared_ptr

~shared_ptr();

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

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

Примечания

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

Пример

#include <iostream>
#include <memory>
 
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'); // would print "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()

См. также

(деструктор)
уничтожает weak_ptr
(публичный метод std::weak_ptr<T>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/shared_ptr/%7Eshared_ptr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API