std::unique_ptr::reset
De cppreference.com
<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:
- guarda una copia del puntero actual
old_ptr = current_ptr; - sobrescribe el puntero actual con el argumento
current_ptr = ptr; - 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
Ues el mismo tipo quepointer, opointeres el mismo tipo queelement_type*yUes un tipo punteroV*tal queV(*)[]es convertible aelement_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
Ejecuta este código
#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) |