Share via


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>apmember - 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

Consulte también

unique_ptr Class