Teilen über


auto_ptr-Klasse

Schließt eine Ressource in einen intelligenten Zeiger ein, der sicherstellt, dass die Ressource automatisch zerstört wird, wenn die Steuerung einen Block verlässt.

Verwenden Sie unique_ptr ab C++11 anstelle von auto_ptr. Weitere Informationen finden Sie unter unique_ptr Klasse. auto_ptr wurde in C++11 veraltet und in C++17 entfernt.

Weitere Informationen zu throw() und zur Behandlung von Ausnahmen finden Sie unter Ausnahmespezifikationen (throw).

Syntax

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);
};

Parameter

right
Der auto_ptr, aus dem eine vorhandene Ressource abgerufen werden soll.

ptr
Der Zeiger, der den gespeicherten Zeiger ersetzen soll.

Hinweise

Die Klassenvorlage beschreibt einen intelligenten Zeiger, der als "an auto_ptr" bezeichnet wird, auf ein zugeordnetes Objekt. Der Zeiger muss entweder gleich NULL oder ein Objekt sein, das durch new zugeordnet ist. Der auto_ptr übergibt den Besitz, wenn sein gespeicherter Wert einem anderen Objekt zugewiesen wird. (Er ersetzt den gespeicherten Wert nach einer Übertragung durch einen Nullzeiger.) Der Destruktor für auto_ptr<Type> Löscht das zugeordnete Objekt. Der auto_ptr<Type> stellt sicher, dass ein zugeordnetes Objekt automatisch gelöscht wird, wenn die Steuerung einen Block verlässt, selbst wenn dies über eine ausgelöste Ausnahme erfolgt. Sie sollten nicht zwei auto_ptr<Type> Objekte erstellen, die dasselbe Objekt besitzen.

Sie können ein auto_ptr<Type>-Objekt als Wert als ein Argument für einen Funktionsaufruf übergeben. Ein auto_ptr Element eines Standardbibliothekscontainers kann nicht sein. Sie können eine Abfolge von auto_ptr<Type> Objekten mit einem C++-Standardbibliothekscontainer nicht zuverlässig verwalten.

Member

Konstruktoren

Name Beschreibung
auto_ptr Der Konstruktor für Objekte des Typs auto_ptr.

TypeDefs

Name Beschreibung
element_type Der Type stellt ein Synonym für den Vorlagenparameter Typedar.

Functions

Name Beschreibung
get Die Memberfunktion gibt den gespeicherten Zeiger myptr zurück.
release Der Member ersetzt den gespeicherten Zeiger myptr durch einen NULL-Zeiger und gibt den zuvor gespeicherten Zeiger zurück.
reset Die Memberfunktion wertet den Ausdruck delete myptr aus, allerdings nur, wenn sich der Wert des gespeicherten Zeigers myptr aufgrund eines Funktionsaufrufs ändert. Anschließend ersetzt die Funktion den gespeicherten Zeiger durch ptr.

Operatoren

Name Beschreibung
operator= Ein Zuweisungsoperator, der den Besitz von einem auto_ptr-Objekt an ein anderes Objekt übergibt.
operator* Der dereferenzierende Operator für Objekte des Typs auto_ptr.
operator-> Der Operator zum Ermöglichen von Memberzugriff.
operator auto_ptr<Other> Nimmt eine Umwandlung aus einer Art von auto_ptr in eine andere Art von auto_ptr vor.
operator auto_ptr_ref<Other> Nimmt eine Umwandlung von einem auto_ptr zu einem anderen auto_ptr_ref vor.

auto_ptr

Der Konstruktor für Objekte des Typs 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();

Parameter

ptr
Der Zeiger auf das Objekt, das auto_ptr kapselt.

right
Das auto_ptr-Objekt, das vom Konstruktor kopiert werden soll.

Hinweise

Der erste Konstruktor speichert ptr im myptrgespeicherten Zeiger auf das zugeordnete Objekt. Der zweite Konstruktor überträgt den Besitz des in right gespeicherten Zeigers durch Speichern von right. Release in myptr.

Der dritte Konstruktor verhält sich genauso wie der zweite, mit der Ausnahme, dass er gespeichert wird right. ref. release in myptr, where ref is the reference stored in right.

Der Vorlagenkonstruktor verhält sich genauso wie der zweite Konstruktor, wenn ein Zeiger Other implizit in einen Zeiger Typekonvertiert werden kann.

Beispiel

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

Der Type stellt ein Synonym für den Vorlagenparameter Typedar.

typedef Type element  _type;

get

Die Memberfunktion gibt den gespeicherten Zeiger myptr zurück.

Type *get() const throw();

Rückgabewert

Der gespeicherte Zeiger myptr.

Beispiel

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

Ein Zuweisungsoperator, der den Besitz von einem auto_ptr-Objekt an ein anderes Objekt übergibt.

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();

Parameter

right
Ein Objekt des Typs auto_ptr.

Rückgabewert

Ein Verweis auf ein Objekt des Typs auto_ptr<Type>.

Hinweise

Die Zuordnung wertet den Ausdruck delete myptraus, aber nur, wenn sich der gespeicherte Zeiger myptr als Ergebnis der Zuordnung ändert. Anschließend überträgt sie den Besitz des im Recht gespeicherten Zeigers, indem er das Recht speichert.release in myptr. Die Funktion gibt *this zurück.

Beispiel

Ein Beispiel für die Verwendung des Memberoperators finden Sie unter auto_ptr.

operator*

Der dereferenzierende Operator für Objekte des Typs auto_ptr.

Type& operator*() const throw();

Rückgabewert

Ein Verweis auf ein Objekt vom Typ Type , das der Zeiger besitzt.

Hinweise

Der Dereferenzierungsoperator gibt *get zurück. Daher darf der gespeicherte Zeiger nicht NULL sein.

Beispiel

Ein Beispiel für die Verwendung der Memberfunktion finden Sie unter auto_ptr.

operator->

Der Operator zum Ermöglichen von Memberzugriff.

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

Rückgabewert

Ein Element des Objekts, das auto_ptr besitzt.

Hinweise

Der Auswahloperator gibt zurückget( ), sodass sich der Ausdruck>apmember gleich verhält wie ( ap. get() )->member, wobei ap ein Objekt der Klasse>auto_ptr<Type ist. Daher darf der gespeicherte Zeiger nicht null sein und Type muss eine Klasse, struktur oder ein Union-Typ mit einem member Element sein.

Beispiel

Ein Beispiel für die Verwendung der Memberfunktion finden Sie unter auto_ptr.

operator auto_ptr<Other>

Nimmt eine Umwandlung aus einer Art von auto_ptr in eine andere Art von auto_ptr vor.

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

Rückgabewert

Der Typ-Umwandlungsoperator gibt "Other">(*this) zurückauto_ptr<.

Beispiel

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

Nimmt eine Umwandlung von einem auto_ptr zu einem anderen auto_ptr_ref vor.

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

Rückgabewert

Der Typ-Umwandlungsoperator gibt auto_ptr_ref<Other>(*this) zurück.

Beispiel

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

Der Member ersetzt den gespeicherten Zeiger myptr durch einen NULL-Zeiger und gibt den zuvor gespeicherten Zeiger zurück.

Type *release() throw();

Rückgabewert

Der zuvor gespeicherte Zeiger.

Hinweise

Der Member ersetzt den gespeicherten Zeiger myptr durch einen NULL-Zeiger und gibt den zuvor gespeicherten Zeiger zurück.

Beispiel

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

Die Memberfunktion wertet den Ausdruck delete myptraus, aber nur, wenn sich der gespeicherte Zeigerwert myptr aufgrund eines Funktionsaufrufs ändert. Anschließend ersetzt die Funktion den gespeicherten Zeiger durch ptr.

void reset(Type* ptr = 0);

Parameter

ptr
Der angegebene Zeiger, um den gespeicherten Zeiger myptrzu ersetzen.

Beispiel

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

Siehe auch

unique_ptr Class