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