close
Espacios de nombres
Variantes

std::unique_ptr::reset

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>
Miembros de la plantilla primaria, unique_ptr<T>
void reset( pointer ptr = pointer() ) noexcept;
(1) (constexpr since C++23)
Miembros de la especialización para arrays, unique_ptr<T[]>
template< class U > void reset( U ptr ) noexcept;
(2) (constexpr since C++23)
void reset( std::nullptr_t = nullptr ) noexcept;
(3) (constexpr since C++23)

Reemplaza el objeto gestionado.

1) Dado current_ptr, el puntero que fue gestionado por *this, realiza las siguientes acciones, en este orden:
  1. guarda una copia del puntero actual old_ptr = current_ptr;
  2. sobrescribe el puntero actual con el argumento current_ptr = ptr;
  3. si el puntero anterior no estaba vacío, elimina el objeto gestionado anteriormente if(old_ptr) get_deleter()(old_ptr).
2) Se comporta igual que el miembro reset de la plantilla principal, excepto que solo participará en la resolución de sobrecarga si
  1. U es el mismo tipo que pointer, o
  2. pointer es el mismo tipo que element_type* y U es un tipo puntero V* tal que V(*)[] es convertible a element_type(*)[].
3) Equivalente a reset(pointer()).

Parámetros

ptr - Puntero a un nuevo objeto a gestionar.

Valor de retorno

(Ninguno)

Notas

Para reemplazar el objeto gestionado mientras se proporciona también un nuevo eliminador, se puede utilizar el operador de asignación de movimiento.

No se realiza una prueba de autoreinicio (self-reset), es decir, si ptr apunta a un objeto ya gestionado por *this, excepto cuando se proporciona como una extensión del compilador o como una aserción de depuración. Ten en cuenta que el código como p.reset(p.release()) no implica el autoreinicio, solo lo hace el código como p.reset(p.get()).

Ejemplo

#include <iostream>
#include <memory>

struct Foo { // objeto a gestionar
    Foo() { std::cout << "Foo...\n"; }
    ~Foo() { std::cout << "~Foo...\n"; }
};

struct D { // eliminador
    void operator() (Foo* p) {
        std::cout << "Llamando a delete para un objeto Foo... \n";
        delete p;
    }
};

int main()
{
    std::cout << "Creando un nuevo objeto Foo...\n";
    std::unique_ptr<Foo, D> up(new Foo(), D());  // up posee el puntero al objeto pointer (deleter D)

    std::cout << "Reemplazar objeto Foo poseído con un nuevo objeto Foo...\n";
    up.reset(new Foo());  // llama al eliminador para el anterior

    std::cout << "Liberar y eliminar el objeto Foo poseído...\n";
    up.reset(nullptr);      
}

Salida:

Creando un nuevo objeto Foo...
Foo...
Reemplazar objeto Foo poseído con un nuevo objeto Foo...
Foo...
Llamando a delete para un objeto Foo...
~Foo...
Liberar y eliminar el objeto Foo poseído...
Llamando a delete para un objeto Foo...
~Foo...

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2118 C++11 unique_ptr<T[]>::reset rechazaba las conversiones de calificación. Las acepta.

Véase también

Devuelve un puntero al objeto gestionado y libera la posesión.
(función miembro pública) [editar]