Espacios de nombres
Variantes

std::shared_ptr<T>::~shared_ptr

De cppreference.com
 
 
Biblioteca de servicios
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
<tbody> </tbody>
~shared_ptr();

Si *this posee un objeto y es el último shared_ptr que lo posee, el objeto se destruye a través del eliminador poseído por *this.

Después de la destrucción, los punteros inteligentes que compartían la posesión con *this, si los hubiera, informarán un use_count() que es uno menos que su valor anterior.

Notas

A diferencia de std::unique_ptr, el eliminador de std::shared_ptr se invoca incluso si el puntero gestionado es nulo.

Ejemplo

#include <memory>
#include <iostream>

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

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

    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'); // imprimiría "F) use_count(): 0"
}

Salida:

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

Véase también

Destruye un weak_ptr.
(función miembro pública de std::weak_ptr) [editar]