Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 newelement . 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 Typeszablonu . |
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 myptrobiekcie , przechowywany wskaźnik do przydzielonego obiektu. Drugi konstruktor przenosi własność wskaźnika przechowywanego w rightobiekcie, przechowując rightelement . wydanie w programie myptr.
Trzeci konstruktor zachowuje się tak samo jak drugi, z tą różnicą, że przechowuje rightwartość . ref. release w myptrpliku , 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 Typeszablonu .
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 *thiswartość .
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