Partage via


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_ptrque . 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_ptrun 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 myptrstocké .

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 myptrstocké .

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

Voir aussi

unique_ptr Class