auto_ptr (Clase)
Encapsula un puntero inteligente en torno a un recurso que garantiza que el recurso se destruye automáticamente cuando el control abandona un bloque.
A partir de C++11, use unique_ptr
en lugar de auto_ptr
. Para obtener más información, consulte unique_ptr
la clase . auto_ptr
estaba en desuso en C++11 y se quitó en C++17.
Para más información sobre throw()
y el control de excepciones, vea Especificaciones de excepciones (throw).
Sintaxis
class auto_ptr {
typedef Type element_type;
explicit auto_ptr(Type* ptr = 0) throw();
auto_ptr(auto_ptr<Type>& right) throw()
;
template <class Other>
operator auto_ptr<Other>() throw();
template <class Other>
auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
template <class Other>
auto_ptr(auto_ptr<Other>& right);
auto_ptr<Type>& operator=(auto_ptr<Type>& right);
~auto_ptr();
Type& operator*() const throw();
Type * operator->()const throw();
Type *get() const throw();
Type *release()throw();
void reset(Type* ptr = 0);
};
Parámetros
right
auto_ptr
desde el que se va a obtener un recurso existente.
ptr
Puntero especificado para reemplazar el puntero almacenado .
Comentarios
La plantilla de clase describe un puntero inteligente, llamado auto_ptr
, en un objeto asignado. El puntero debe ser nulo o designar un objeto asignado por new
. auto_ptr
transfiere la propiedad si su valor almacenado se asigna a otro objeto. (Reemplaza el valor almacenado después de una transferencia por un puntero nulo). El destructor para auto_ptr<Type>
elimina el objeto asignado. auto_ptr<Type>
garantiza que un objeto asignado se elimina automáticamente cuando el control abandona un bloque, incluso a través de una excepción producida. No debe construir dos objetos auto_ptr<Type>
que posean el mismo objeto.
Puede pasar un objeto auto_ptr<Type>
por valor como argumento a una llamada de función. auto_ptr
no puede ser un elemento de ningún contenedor de la biblioteca estándar. No puede administrar de manera fiable una secuencia de objetos auto_ptr<Type>
con un contenedor de la biblioteca estándar de C++.
Miembros
Constructores
Nombre | Descripción |
---|---|
auto_ptr |
Constructor para los objetos de tipo auto_ptr . |
Typedefs
Nombre | Descripción |
---|---|
element_type |
El tipo es un sinónimo del parámetro de plantilla Type . |
Funciones
Nombre | Descripción |
---|---|
get |
La función miembro devuelve el puntero myptr almacenado. |
release |
El miembro reemplaza el puntero myptr almacenado con un puntero nulo y devuelve el puntero almacenado previamente. |
reset |
La función miembro evalúa la expresión delete myptr , pero solo si el valor de puntero myptr almacenado cambia como consecuencia de la llamada de función. A continuación, reemplaza el puntero almacenado con ptr . |
Operadores
Nombre | Descripción |
---|---|
operator= |
Operador de asignación que transfiere la propiedad de un objeto auto_ptr a otro. |
operator* |
Operador de desreferenciación para objetos de tipo auto_ptr . |
operator-> |
Operador para permitir el acceso a miembros. |
operator auto_ptr<Other> |
Convierte de un tipo de auto_ptr a otro tipo de auto_ptr . |
operator auto_ptr_ref<Other> |
Convierte de auto_ptr a auto_ptr_ref . |
auto_ptr
Constructor para los objetos de tipo auto_ptr
.
explicit auto_ptr(Type* ptr = 0) throw();
auto_ptr(auto_ptr<Type>& right) throw();
auto_ptr(auto _ptr_ref<Type> right) throw();
template <class Other>
auto _ptr(auto _ptr<Other>& right) throw();
Parámetros
ptr
Puntero al objeto que auto_ptr
encapsula.
right
Objeto auto_ptr
que el constructor va a copiar.
Comentarios
El primer constructor almacena ptr
en myptr
, el puntero almacenado al objeto asignado. El segundo constructor transfiere la propiedad del puntero almacenado en right
al almacenar right
. versión en myptr
.
El tercer constructor se comporta igual que el segundo, salvo que almacena right
. ref
. release
en myptr
, donde ref
es la referencia almacenada en right
.
El constructor de plantilla se comporta igual que el segundo constructor, si un puntero Other
puede convertirse implícitamente en un puntero a Type
.
Ejemplo
// auto_ptr_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
cout << "Constructing " << ( void* )this << endl;
x = i;
bIsConstructed = true;
};
~Int( )
{
cout << "Destructing " << ( void* )this << endl;
bIsConstructed = false;
};
Int &operator++( )
{
x++;
return *this;
};
int x;
private:
bool bIsConstructed;
};
void function ( auto_ptr<Int> &pi )
{
++( *pi );
auto_ptr<Int> pi2( pi );
++( *pi2 );
pi = pi2;
}
int main( )
{
auto_ptr<Int> pi ( new Int( 5 ) );
cout << pi->x << endl;
function( pi );
cout << pi->x << endl;
}
Constructing 00311AF8
5
7
Destructing 00311AF8
element_type
El tipo es un sinónimo del parámetro de plantilla Type
.
typedef Type element _type;
get
La función miembro devuelve el puntero myptr
almacenado.
Type *get() const throw();
Valor devuelto
El puntero almacenado myptr
.
Ejemplo
// auto_ptr_get.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << ( void* )this << " Value: " << x << endl;
};
~Int( )
{
cout << "Destructing " << ( void* )this << " Value: " << x << endl;
};
int x;
};
int main( )
{
auto_ptr<Int> pi ( new Int( 5 ) );
pi.reset( new Int( 6 ) );
Int* pi2 = pi.get ( );
Int* pi3 = pi.release ( );
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6
operator=
Operador de asignación que transfiere la propiedad de un objeto auto_ptr
a otro.
template <class Other>
auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
auto_ptr<Type>& operator=(auto_ptr<Type>& right) throw();
auto_ptr<Type>& operator=(auto_ptr_ref<Type> right) throw();
Parámetros
right
Objeto de tipo auto_ptr
.
Valor devuelto
Referencia a un objeto de tipo auto_ptr<Type>
.
Comentarios
La asignación evalúa la expresión delete myptr
, pero solo si el puntero almacenado myptr
cambia como resultado de la asignación. A continuación, transfiere la propiedad del puntero almacenado a la derecha, almacenando la derecha.release
en myptr
. La función devuelve *this
.
Ejemplo
Para obtener un ejemplo del uso del operador miembro, vea auto_ptr
.
operator*
Operador de desreferenciación para objetos de tipo auto_ptr
.
Type& operator*() const throw();
Valor devuelto
Referencia a un objeto de tipo Type
propiedad del puntero.
Comentarios
El operador de direccionamiento indirecto devuelve *
get
. Por tanto, el puntero almacenado no debe ser nulo.
Ejemplo
Para obtener un ejemplo de cómo usar la función miembro, vea auto_ptr
.
operator->
Operador para permitir el acceso a miembros.
Type * operator->() const throw();
Valor devuelto
Un miembro del objeto propiedad de auto_ptr
.
Comentarios
El operador de selección devuelve get
( )
, de modo que la expresión>ap
member
- se comporta igual que ( ap
. get
() )->, donde ap
es un objeto de la clase auto_ptr<
Type
>.member
Por tanto, el puntero almacenado no debe ser null, y Type
debe ser una clase, struct o tipo de unión con un miembro member
.
Ejemplo
Para obtener un ejemplo de cómo usar la función miembro, vea auto_ptr
.
operator auto_ptr<Other>
Convierte de un tipo de auto_ptr
a otro tipo de auto_ptr
.
template <class Other>
operator auto _ptr<Other>() throw();
Valor devuelto
El operador de conversión de tipos devuelve auto_ptr<
Other>(*this)
.
Ejemplo
// auto_ptr_op_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
auto_ptr<int> pi ( new int( 5 ) );
auto_ptr<const int> pc = ( auto_ptr<const int> )pi;
}
operator auto_ptr_ref<Other>
Convierte de auto_ptr
a auto_ptr_ref
.
template <class Other>
operator auto _ptr _ref<Other>() throw();
Valor devuelto
El operador de conversión de tipos devuelve auto_ptr_refOther
<
>(*this)
.
Ejemplo
// auto_ptr_op_auto_ptr_ref.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class C {
public:
C(int _i) : m_i(_i) {
}
~C() {
cout << "~C: " << m_i << "\n";
}
C &operator =(const int &x) {
m_i = x;
return *this;
}
int m_i;
};
void f(auto_ptr<C> arg) {
};
int main()
{
const auto_ptr<C> ciap(new C(1));
auto_ptr<C> iap(new C(2));
// Error: this implies transfer of ownership of iap's pointer
// f(ciap);
f(iap); // compiles, but gives up ownership of pointer
// here, iap owns a destroyed pointer so the following is bad:
// *iap = 5; // BOOM
cout << "main exiting\n";
}
~C: 2
main exiting
~C: 1
release
El miembro reemplaza el puntero myptr
almacenado con un puntero nulo y devuelve el puntero almacenado previamente.
Type *release() throw();
Valor devuelto
Puntero almacenado previamente.
Comentarios
El miembro reemplaza el puntero myptr
almacenado con un puntero nulo y devuelve el puntero almacenado previamente.
Ejemplo
// auto_ptr_release.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << (void*)this << " Value: " << x << endl;
};
~Int() {
cout << "Destructing " << (void*)this << " Value: " << x << endl;
};
int x;
};
int main()
{
auto_ptr<Int> pi(new Int(5));
pi.reset(new Int(6));
Int* pi2 = pi.get();
Int* pi3 = pi.release();
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6
reset
La función miembro evalúa la expresión delete myptr
, pero solo si el valor de puntero myptr
almacenado cambia como consecuencia de una llamada de función. A continuación, reemplaza el puntero almacenado con ptr
.
void reset(Type* ptr = 0);
Parámetros
ptr
Puntero especificado para reemplazar el puntero almacenado myptr
.
Ejemplo
// auto_ptr_reset.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << (void*)this << " Value: " << x << endl;
};
~Int()
{
cout << "Destructing " << (void*)this << " Value: " << x << endl;
};
int x;
};
int main()
{
auto_ptr<Int> pi(new Int(5));
pi.reset(new Int(6));
Int* pi2 = pi.get();
Int* pi3 = pi.release();
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6