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 Type dar. |
Funktionen
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 myptr
gespeicherten 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 Type
konvertiert 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 Type
dar.
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 myptr
aus, 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>ap
member
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 myptr
aus, 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 myptr
zu 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