auto_ptr, classe
Encapsule un pointeur intelligent autour d’une ressource qui garantit que celle-ci est détruite automatiquement quand le contrôle quitte un bloc.
À compter de C++11, utilisez unique_ptr
plutôt auto_ptr
que . Pour plus d’informations, consultez unique_ptr
la classe. auto_ptr
a été déconseillé en C++11 et supprimé en C++17.
Pour plus d’informations sur throw()
et sur la gestion des exceptions, consultez Spécifications d’exceptions (throw).
Syntaxe
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);
};
Paramètres
right
auto_ptr
à partir duquel obtenir une ressource existante.
ptr
Pointeur spécifié pour remplacer le pointeur stocké.
Notes
Le modèle de classe décrit un pointeur intelligent appelé auto_ptr
un objet alloué. Le pointeur doit avoir la valeur null ou désigner un objet alloué par new
. Le auto_ptr
transfère la propriété si sa valeur stockée est assignée à un autre objet. (Il remplace la valeur stockée après un transfert par un pointeur Null.) Destructeur pour auto_ptr<Type>
supprimer l’objet alloué. Le auto_ptr<Type>
garantit qu'un objet alloué est supprimé automatiquement quand le contrôle quitte un bloc, même suite à la levée d'une exception. Vous ne devez pas construire deux auto_ptr<Type>
objets qui possèdent le même objet.
Vous pouvez passer un objet auto_ptr<Type>
par valeur en tant qu'argument à un appel de fonction. Il auto_ptr
ne peut pas s’agir d’un élément d’un conteneur de bibliothèque standard. Vous ne pouvez pas gérer de manière fiable une séquence d’objets auto_ptr<Type>
avec un conteneur de bibliothèque standard C++.
Membres
Constructeurs
Nom | Description |
---|---|
auto_ptr |
Constructeur des objets de type auto_ptr . |
Typedefs
Nom | Description |
---|---|
element_type |
Le type est un synonyme du paramètre de modèle Type . |
Functions
Nom | Description |
---|---|
get |
La fonction membre retourne le pointeur stocké myptr . |
release |
Le membre remplace le pointeur stocké myptr par un pointeur null et il retourne le pointeur stocké précédemment. |
reset |
La fonction membre évalue l'expression delete myptr , mais uniquement si la valeur de pointeur stocké myptr change suite à l'appel de fonction. Elle remplace ensuite le pointeur stocké par ptr . |
Opérateurs
Nom | Description |
---|---|
operator= |
Opérateur d'assignation qui transfère la propriété d'un objet auto_ptr à un autre. |
operator* |
Opérateur de déréférencement pour les objets de type auto_ptr . |
operator-> |
Opérateur pour autoriser l'accès aux membres. |
operator auto_ptr<Other> |
Effectue un cast d'un type de auto_ptr vers un autre type de auto_ptr . |
operator auto_ptr_ref<Other> |
Effectue un cast d'un auto_ptr vers un auto_ptr_ref . |
auto_ptr
Constructeur des objets de type 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();
Paramètres
ptr
Pointeur vers l’objet que auto_ptr
encapsule.
right
L’objet auto_ptr
doit être copié par le constructeur.
Notes
Le premier constructeur stocke ptr
dans myptr
, le pointeur stocké vers l’objet alloué. Le deuxième constructeur transfère la propriété du pointeur stocké dans right
en stockant right
. mise en production dans myptr
.
Le troisième constructeur se comporte de la même façon que le deuxième, sauf qu’il stocke right
. ref
. release
in myptr
, où ref
est la référence stockée dans right
.
Le constructeur de modèle se comporte de la même façon que le deuxième constructeur, si un pointeur à convertir Other
implicitement en pointeur en Type
.
Exemple
// 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
Le type est un synonyme du paramètre de modèle Type
.
typedef Type element _type;
get
La fonction membre retourne le pointeur stocké myptr
.
Type *get() const throw();
Valeur de retour
Pointeur myptr
stocké .
Exemple
// 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=
Opérateur d'assignation qui transfère la propriété d'un objet auto_ptr
à un autre.
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();
Paramètres
right
Objet de type auto_ptr
.
Valeur de retour
Référence à un objet de type auto_ptr<Type>
.
Notes
L’affectation évalue l’expression delete myptr
, mais uniquement si le pointeur myptr
stocké change à la suite de l’affectation. Il transfère ensuite la propriété du pointeur stocké à droite, en stockant le droit.release
dans myptr
. La fonction retourne *this
.
Exemple
Pour obtenir un exemple d’utilisation de l’opérateur membre, consultez auto_ptr
.
operator*
Opérateur de déréférencement pour les objets de type auto_ptr
.
Type& operator*() const throw();
Valeur de retour
Référence à un objet de type Type
propriétaire du pointeur.
Notes
L’opérateur d’indirection retourne *
get
. Par conséquent, le pointeur stocké ne doit pas être null.
Exemple
Pour obtenir un exemple d’utilisation de la fonction membre, consultez auto_ptr
.
operator->
Opérateur pour autoriser l'accès aux membres.
Type * operator->() const throw();
Valeur de retour
Membre de l’objet propriétaire auto_ptr
.
Notes
L’opérateur de sélection retourne get
, de sorte que l’expression ap
->member
se comporte comme ( ap
.( )
get
() )->, où ap
est un objet de classe auto_ptr<
Type
>.member
Par conséquent, le pointeur stocké ne doit pas être null et Type
doit être une classe, un struct ou un type d’union avec un member
membre.
Exemple
Pour obtenir un exemple d’utilisation de la fonction membre, consultez auto_ptr
.
operator auto_ptr<Other>
Effectue un cast d'un type de auto_ptr
vers un autre type de auto_ptr
.
template <class Other>
operator auto _ptr<Other>() throw();
Valeur de retour
L’opérateur de cast de type retourne auto_ptr<
Other>(*this)
.
Exemple
// 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>
Effectue un cast d'un auto_ptr
vers un auto_ptr_ref
.
template <class Other>
operator auto _ptr _ref<Other>() throw();
Valeur de retour
L’opérateur de cast de type retourne auto_ptr_refOther
<
>(*this)
.
Exemple
// 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
Le membre remplace le pointeur stocké myptr
par un pointeur null et il retourne le pointeur stocké précédemment.
Type *release() throw();
Valeur de retour
Pointeur stocké précédemment.
Notes
Le membre remplace le pointeur stocké myptr
par un pointeur null et il retourne le pointeur stocké précédemment.
Exemple
// 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 fonction membre évalue l’expression delete myptr
, mais uniquement si la valeur myptr
du pointeur stockée change à la suite d’un appel de fonction. Elle remplace ensuite le pointeur stocké par ptr
.
void reset(Type* ptr = 0);
Paramètres
ptr
Pointeur spécifié pour remplacer le pointeur myptr
stocké .
Exemple
// 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