Espacios de nombres
Variantes
Acciones

std::shared_ptr<T>::reset

De cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
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)
 
 
void reset() noexcept;
(1) (desde C++11)
template< class Y >
void reset( Y* ptr );
(2) (desde C++11)
template< class Y, class Deleter >
void reset( Y* ptr, Deleter d );
(3) (desde C++11)
template< class Y, class Deleter, class Alloc >
void reset( Y* ptr, Deleter d, Alloc alloc );
(4) (desde C++11)

Reemplaza el objeto gestionado con un objeto al que apunta ptr. Se puede proporcionar el eliminador opcional d, que luego se usa para destruir el nuevo objeto cuando ningún objeto shared_ptr lo posee. Por defecto, la expresión delete se usa como eliminador. Siempre se selecciona la expresión adecuada delete correspondiente al tipo proporcionado, esta es la razón por la cual la función se implementa como plantilla usando un parámetro separado Y.

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

Si el objeto al que apunta ptr ya se posee, la función generalmente da como resultado un comportamiento no definido.

1) Libera la posesión del objeto gestionado, si la hubiere. después de la llamada, *this no gestiona ningún objeto. Equivalente a shared_ptr().swap(*this);
2-4) Reemplaza el objeto gestionado con un objeto apuntado por ptr. Y debe ser un tipo completo e implícitamente convertible a T. Además:
2) Utiliza la expresión delete como eliminador. Debe estar disponible una expresión válida delete, es decir, delete ptr debe estar bien formada, tener un comportamiento bien definido y no lanzar ninguna excepción. Equivalente a shared_ptr<T>(ptr).swap(*this);.
3) Utiliza el eliminador especificado d como eliminador. Deleter debe poder llamarse para el tipo T, es decir, d(ptr) debe estar bien formado, tener un comportamiento bien definido y no lanzar ninguna excepción. Deleter debe ser CopyConstructible, y su constructor de copia y destructor no deben lanzar excepciones. Equivalente a shared_ptr<T>(ptr, d).swap(*this);.
4) Igual que (3), pero además usa una copia de alloc para la asignación de datos para uso interno. Alloc debe ser un Allocator. El constructor de copia y el destructor no deben lanzar excepciones. Equivalente a shared_ptr<T>(ptr, d, alloc).swap(*this);.

Contenido

[editar] Parámetros

ptr - Puntero a un objeto del que adquirir la posesión.
d - Eliminador a almacenar para la eliminación del objeto.
alloc - Asignador de memoria a usar para las asignaciones de memoria internas.

[editar] Valor de retorno

(Ninguno)

[editar] Excepciones

2) std::bad_alloc si no se pudo obtener la memoria adicional necesaria. Puede lanzar una excepción definida por la implementación para otros errores. Se llama a delete ptr si ocurre una excepción.
3-4) std::bad_alloc si no se pudo obtener la memoria adicional necesaria. Puede lanzar una excepción definida por la implementación para otros errores. Se llama a d(ptr) si ocurre una excepción.

[editar] Ejemplo

#include <memory>
#include <iostream>
 
struct Foo {
    Foo(int n = 0) noexcept : bar(n) {
        std::cout << "Foo::Foo(), bar = " << bar << " @ " << this << '\n';
    }
    ~Foo() {
        std::cout << "Foo::~Foo(), bar = " << bar << " @ " << this << "\n";
    }
    int getBar() const noexcept { return bar; }
private:
    int bar;
};
 
int main()
{
    std::cout << "1) Propiedad única\n";
    {
        std::shared_ptr<Foo> sptr = std::make_shared<Foo>(100);
 
        std::cout << "Foo::bar = " << sptr->getBar() << ", use_count() = "
                  << sptr.use_count() << '\n';
 
        // Restablecer el shared_ptr sin darle una nueva instancia de Foo.
        // La instancia anterior se destruirá después de esta llamada.
        std::cout << "llamar a sptr.reset()...\n";
        sptr.reset(); // aquí se llama al destructor de Foo
        std::cout << "después de llamar a reset(): use_count() = " << sptr.use_count()
                  << ", sptr = " << sptr << '\n';
    }   // No se llama al destructor de Foo, se hizo antes en reset().
 
    std::cout << "\n2) Propiedad única\n";
    {
        std::shared_ptr<Foo> sptr = std::make_shared<Foo>(200);
 
        std::cout << "Foo::bar = " << sptr->getBar() << ", use_count() = "
                  << sptr.use_count() << '\n';
 
        // Restablecer el shared_ptr dándole una nueva instancia de Foo.
        // La instancia anterior se destruirá después de esta llamada.
        std::cout << "llamar a sptr.reset()...\n";
        sptr.reset(new Foo{222});
        std::cout << "después de llamar a reset(): use_count() = " << sptr.use_count()
                  << ", sptr = " << sptr << "\nsaliendo de ámbito...\n";
    }   // Se llama al destructor de Foo.
 
    std::cout << "\n3) Propiedad múltiple\n";
    {
        std::shared_ptr<Foo> sptr1 = std::make_shared<Foo>(300);
        std::shared_ptr<Foo> sptr2 = sptr1;
        std::shared_ptr<Foo> sptr3 = sptr2;
 
        std::cout << "Foo::bar = " << sptr1->getBar() << ", use_count() = "
                  << sptr1.use_count() << '\n';
 
        // Restablecer el shared_ptr sptr1, dándole una nueva instancia de Foo.
        // La instancia anterior quedará compartida entre sptr2 y sptr3.
        std::cout << "llamar a sptr1.reset()...\n";
        sptr1.reset(new Foo{333});
 
        std::cout << "después de llamar a reset():\n"
                  << "sptr1.use_count() = " << sptr1.use_count()
                  << ", sptr1 @ " << sptr1 << '\n'
                  << "sptr2.use_count() = " << sptr2.use_count()
                  << ", sptr2 @ " << sptr2 << '\n'
                  << "sptr3.use_count() = " << sptr3.use_count()
                  << ", sptr3 @ " << sptr3 << '\n'
                  << "saliendo de ámbito...\n";
    }   // Llama a dos destructores de: 1) Foo poseído por sptr1,
        // 2) Foo compartido entre sptr2/sptr3.
}

Posible salida:

1) Propiedad única
Foo::Foo(), bar = 100 @ 0x23c5040
Foo::bar = 100, use_count() = 1
llamar a sptr.reset()...
Foo::~Foo(), bar = 100 @ 0x23c5040
después de llamar a reset(): use_count() = 0, sptr = 0
 
2) Propiedad única
Foo::Foo(), bar = 200 @ 0x23c5040
Foo::bar = 200, use_count() = 1
llamar a sptr.reset()...
Foo::Foo(), bar = 222 @ 0x23c5050
Foo::~Foo(), bar = 200 @ 0x23c5040
después de llamar a reset(): use_count() = 1, sptr = 0x23c5050
saliendo de ámbito...
Foo::~Foo(), bar = 222 @ 0x23c5050
 
3) Propiedad múltiple
Foo::Foo(), bar = 300 @ 0x23c5080
Foo::bar = 300, use_count() = 3
llamar a sptr1.reset()...
Foo::Foo(), bar = 333 @ 0x23c5050
después de llamar a reset():
sptr1.use_count() = 1, sptr1 @ 0x23c5050
sptr2.use_count() = 2, sptr2 @ 0x23c5080
sptr3.use_count() = 2, sptr3 @ 0x23c5080
saliendo de ámbito...
Foo::~Foo(), bar = 300 @ 0x23c5080
Foo::~Foo(), bar = 333 @ 0x23åc5050

[editar] Véase también

Construye un nuevo shared_ptr.
(función miembro pública) [editar]