auto_ptr, klasa
Opakowuje inteligentny wskaźnik wokół zasobu, który gwarantuje, że zasób zostanie zniszczony automatycznie, gdy kontrolka opuści blok.
Począwszy od języka C++11, użyj polecenia unique_ptr
zamiast auto_ptr
. Aby uzyskać więcej informacji, zobacz unique_ptr
klasa. auto_ptr
został wycofany w języku C++11 i usunięty w języku C++17.
Aby uzyskać więcej informacji na temat throw()
obsługi wyjątków i obsługi wyjątków, zobacz Specyfikacje wyjątków (throw).
Składnia
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);
};
Parametry
right
Element auto_ptr
, z którego ma być pobierany istniejący zasób.
ptr
Wskaźnik określony w celu zastąpienia przechowywanego wskaźnika.
Uwagi
Szablon klasy opisuje inteligentny wskaźnik o nazwie auto_ptr
, do przydzielonego obiektu. Wskaźnik musi mieć wartość null lub wyznaczyć obiekt przydzielony przez new
element . Przeniesienie auto_ptr
własności, jeśli jego przechowywana wartość jest przypisana do innego obiektu. (Zastępuje przechowywaną wartość po przeniesieniu wskaźnikiem o wartości null). Destruktor auto_ptr<Type>
usuwa przydzielony obiekt. Zapewnia auto_ptr<Type>
, że przydzielony obiekt jest automatycznie usuwany, gdy kontrolka opuszcza blok, nawet przez zgłoszony wyjątek. Nie należy konstruować dwóch auto_ptr<Type>
obiektów, które są właścicielem tego samego obiektu.
Obiekt można przekazać auto_ptr<Type>
według wartości jako argument do wywołania funkcji. Nie auto_ptr
można być elementem żadnego kontenera biblioteki standardowej. Nie można niezawodnie zarządzać sekwencją auto_ptr<Type>
obiektów za pomocą kontenera biblioteki standardowej języka C++.
Elementy członkowskie
Konstruktory
Nazwa/nazwisko | opis |
---|---|
auto_ptr |
Konstruktor dla obiektów typu auto_ptr . |
Typedefs
Nazwa/nazwisko | opis |
---|---|
element_type |
Typ jest synonimem parametru Type szablonu . |
Funkcje
Nazwa/nazwisko | opis |
---|---|
get |
Funkcja składowa zwraca przechowywany wskaźnik myptr . |
release |
Element członkowski zastępuje przechowywany wskaźnik myptr wskaźnikiem o wartości null i zwraca wcześniej przechowywany wskaźnik. |
reset |
Funkcja składowa oblicza wyrażenie delete myptr , ale tylko wtedy, gdy wartość myptr przechowywanego wskaźnika zmienia się w wyniku wywołania funkcji. Następnie zastępuje przechowywany wskaźnik wartością ptr . |
Operatory
Nazwa/nazwisko | opis |
---|---|
operator= |
Operator przypisania, który przenosi własność z jednego auto_ptr obiektu na inny. |
operator* |
Operator wyłudania dla obiektów typu auto_ptr . |
operator-> |
Operator umożliwiający dostęp do składowych. |
operator auto_ptr<Other> |
Rzutuje od jednego rodzaju auto_ptr do innego rodzaju auto_ptr . |
operator auto_ptr_ref<Other> |
Rzutuje z elementu auto_ptr na .auto_ptr_ref |
auto_ptr
Konstruktor dla obiektów typu 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();
Parametry
ptr
Wskaźnik do obiektu, który auto_ptr
hermetyzuje.
right
auto_ptr
Obiekt, który ma zostać skopiowany przez konstruktora.
Uwagi
Pierwszy konstruktor przechowuje ptr
w myptr
obiekcie , przechowywany wskaźnik do przydzielonego obiektu. Drugi konstruktor przenosi własność wskaźnika przechowywanego w right
obiekcie, przechowując right
element . wydanie w programie myptr
.
Trzeci konstruktor zachowuje się tak samo jak drugi, z tą różnicą, że przechowuje right
wartość . ref
. release
w myptr
pliku , gdzie ref
jest odwołaniem przechowywanym w pliku right
.
Konstruktor szablonu zachowuje się tak samo jak drugi konstruktor, jeśli wskaźnik Other
może zostać niejawnie przekonwertowany na wskaźnik na Type
.
Przykład
// 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
Typ jest synonimem parametru Type
szablonu .
typedef Type element _type;
get
Funkcja składowa zwraca przechowywany wskaźnik myptr
.
Type *get() const throw();
Wartość zwracana
Przechowywany wskaźnik myptr
.
Przykład
// 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=
Operator przypisania, który przenosi własność z jednego auto_ptr
obiektu na inny.
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();
Parametry
right
Obiekt typu auto_ptr
.
Wartość zwracana
Odwołanie do obiektu typu auto_ptr<Type>
.
Uwagi
Przypisanie oblicza wyrażenie delete myptr
, ale tylko wtedy, gdy przechowywany wskaźnik myptr
zmienia się w wyniku przypisania. Następnie przenosi własność wskaźnika przechowywanego w prawo, przechowując prawo.release
w pliku myptr
. Funkcja zwraca *this
wartość .
Przykład
Aby zapoznać się z przykładem użycia operatora elementu członkowskiego, zobacz auto_ptr
.
operator*
Operator wyłudania dla obiektów typu auto_ptr
.
Type& operator*() const throw();
Wartość zwracana
Odwołanie do obiektu typu Type
, którego jest właścicielem wskaźnika.
Uwagi
Operator pośredni zwraca wartość *
get
. W związku z tym przechowywany wskaźnik nie może mieć wartości null.
Przykład
Aby zapoznać się z przykładem używania funkcji składowej, zobacz auto_ptr
.
operator->
Operator umożliwiający dostęp do składowych.
Type * operator->() const throw();
Wartość zwracana
Element członkowski obiektu, który auto_ptr
jest właścicielem.
Uwagi
Operator zaznaczenia zwraca get
( )
wartość , tak aby wyrażenie ap
>member
zachowywało się tak samo jak ( ap
. get
() )->member
, gdzie ap
jest obiektem klasy .auto_ptr<
Type
> W związku z tym przechowywany wskaźnik nie może mieć wartości null i Type
musi być klasą, strukturą lub typem unii z elementem member
członkowskim.
Przykład
Aby zapoznać się z przykładem używania funkcji składowej, zobacz auto_ptr
.
operator auto_ptr<Other>
Rzutuje od jednego rodzaju auto_ptr
do innego rodzaju auto_ptr
.
template <class Other>
operator auto _ptr<Other>() throw();
Wartość zwracana
Operator rzutowania typu zwraca wartość auto_ptr<
Inne>(*this)
.
Przykład
// 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>
Rzutuje z elementu auto_ptr
na .auto_ptr_ref
template <class Other>
operator auto _ptr _ref<Other>() throw();
Wartość zwracana
Operator rzutowania typu zwraca auto_ptr_refOther
<
>(*this)
.
Przykład
// 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
Element członkowski zastępuje przechowywany wskaźnik myptr
wskaźnikiem o wartości null i zwraca wcześniej przechowywany wskaźnik.
Type *release() throw();
Wartość zwracana
Wcześniej przechowywany wskaźnik.
Uwagi
Element członkowski zastępuje przechowywany wskaźnik myptr
wskaźnikiem o wartości null i zwraca wcześniej przechowywany wskaźnik.
Przykład
// 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
Funkcja składowa oblicza wyrażenie delete myptr
, ale tylko wtedy, gdy przechowywana wartość myptr
wskaźnika zmienia się w wyniku wywołania funkcji. Następnie zastępuje przechowywany wskaźnik wartością ptr
.
void reset(Type* ptr = 0);
Parametry
ptr
Wskaźnik określony w celu zastąpienia przechowywanego wskaźnika myptr
.
Przykład
// 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