Partilhar via


Classe auto_ptr

Encapsula um ponteiro inteligente ao redor de um recurso que garante que o recurso seja destruído automaticamente quando o controle sair de um bloco.

A partir do C++11, use unique_ptr em vez de auto_ptr. Para obter mais informações, consulte unique_ptr classe. auto_ptr foi preterido no C++11 e removido no C++17.

Para obter mais informações sobre throw() e o tratamento de exceções, consulte Especificações de exceção (gerar).

Sintaxe

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
O auto_ptr do qual um recurso existente.

ptr
O ponteiro especificado para substituir o ponteiro armazenado .

Comentários

O modelo de classe descreve um ponteiro inteligente, chamado auto_ptr, para um objeto alocado. O ponteiro deve ser nulo ou designar um objeto alocado pelo new. O auto_ptr transfere a propriedade se o valor armazenado for atribuído a outro objeto. (Ele substitui o valor armazenado após uma transferência por um ponteiro nulo). O destruidor para auto_ptr<Type> exclui o objeto alocado. O auto_ptr<Type> garante que um objeto alocado seja excluído automaticamente quando o controle sai de um bloco, mesmo que seja por meio de uma exceção gerada. Você não deve construir dois objetos auto_ptr<Type> que possuam o mesmo objeto.

Você pode passar um objeto auto_ptr<Type> por valor como um argumento para uma chamada de função. Um auto_ptr não pode ser um elemento de nenhum contêiner da Biblioteca padrão. Você não pode gerenciar de forma confiável uma sequência de objetos auto_ptr<Type> com um contêiner C++ Standard Library.

Membros

Construtores

Nome Descrição
auto_ptr O construtor para objetos do tipo auto_ptr.

Typedefs

Nome Descrição
element_type O tipo é um sinônimo do parâmetro de modeloType.

Funções

Nome Descrição
get A função membro retorna o ponteiro armazenado myptr.
release O membro substitui o ponteiro armazenado myptr por um ponteiro nulo e retorna o ponteiro armazenado anteriormente.
reset A função membro avalia a expressão delete myptr, mas somente se o valor do ponteiro armazenado myptr mudar como resultado da chamada de função. Ele substitui o ponteiro armazenado por ptr.

Operadores

Nome Descrição
operator= Um operador de atribuição que transfere a propriedade de um objeto auto_ptr para outro.
operator* O operador de desreferenciamento para objetos do tipo auto_ptr.
operator-> O operador para permitir o acesso de membro.
operator auto_ptr<Other> Converte de um tipo de auto_ptr para outro tipo de auto_ptr.
operator auto_ptr_ref<Other> Converte de um auto_ptr para um auto_ptr_ref.

auto_ptr

O construtor para objetos do 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
O ponteiro para o objeto que auto_ptr encapsula.

right
O auto_ptr objeto a ser copiada pelo construtor.

Comentários

O primeiro construtor armazena ptr em myptr, o ponteiro armazenado para o objeto alocado. O segundo construtor transfere a propriedade do ponteiro armazenado em right, armazenando right. versão em myptr.

O terceiro construtor se comporta da mesma forma que o segundo, mas armazena right. ref. release em myptr, em que ref é a referência armazenada em right.

O construtor de modelo se comporta da mesma forma que o segundo construtor, se um ponteiro para Other puder ser convertido implicitamente em um ponteiro para Type.

Exemplo

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

O tipo é um sinônimo do parâmetro de modeloType.

typedef Type element  _type;

get

A função membro retorna o ponteiro armazenado myptr.

Type *get() const throw();

Valor de retorno

O ponteiro armazenado myptr.

Exemplo

// 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=

Um operador de atribuição que transfere a propriedade de um objeto auto_ptr para outro.

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
Um objeto do tipo auto_ptr.

Valor de retorno

Referência a um objeto do tipo auto_ptr<Type>.

Comentários

A atribuição avalia a expressão delete myptr, mas somente se o ponteiro armazenado myptr for alterado como resultado da atribuição. Em seguida, ele transfere a propriedade do ponteiro armazenado no direito, armazenando o direito.release em myptr. A função retorna *this.

Exemplo

Para obter um exemplo do uso do operador de membro, consulte auto_ptr.

operator*

O operador de desreferenciamento para objetos do tipo auto_ptr.

Type& operator*() const throw();

Valor de retorno

Uma referência a um objeto do tipo Type que o ponteiro possui.

Comentários

O operador de indireção retorna *get. Portanto, o ponteiro armazenado não deve ser nulo.

Exemplo

Para obter um exemplo de como usar a função membro, consulte auto_ptr.

operator->

O operador para permitir o acesso de membro.

Type * operator->() const throw();

Valor de retorno

Um membro do objeto que auto_ptr possui.

Comentários

O operador de seleção retorna get( ), de modo que a expressão ap->member se comporta da mesma forma que ( ap. get() )->, onde ap é um objeto de classe auto_ptr<Type>.member Portanto, o ponteiro armazenado não deve ser nulo e Type deve ser um tipo de classe, estrutura ou união com um membro member.

Exemplo

Para obter um exemplo de como usar a função membro, consulte auto_ptr.

operator auto_ptr<Other>

Converte de um tipo de auto_ptr para outro tipo de auto_ptr.

template <class Other>
operator auto _ptr<Other>() throw();

Valor de retorno

O operador de conversão de tipo retorna auto_ptr<Other>(*this).

Exemplo

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

Converte de um auto_ptr para um auto_ptr_ref.

template <class Other>
operator auto _ptr  _ref<Other>() throw();

Valor de retorno

O operador de conversão de tipo retorna auto_ptr_refOther<>(*this).

Exemplo

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

O membro substitui o ponteiro armazenado myptr por um ponteiro nulo e retorna o ponteiro armazenado anteriormente.

Type *release() throw();

Valor de retorno

O ponteiro armazenado anteriormente.

Comentários

O membro substitui o ponteiro armazenado myptr por um ponteiro nulo e retorna o ponteiro armazenado anteriormente.

Exemplo

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

A função membro avalia a expressão delete myptr, mas somente se o valor do ponteiro armazenado myptr for alterado como resultado de uma chamada de função. Ele substitui o ponteiro armazenado por ptr.

void reset(Type* ptr = 0);

Parâmetros

ptr
O ponteiro especificado para substituir o ponteiro armazenado myptr.

Exemplo

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

Confira também

unique_ptr Class