auto_ptr – třída
Zabalí inteligentní ukazatel kolem prostředku, který zajistí, že se prostředek automaticky zničí, když ovládací prvek opustí blok.
Počínaje jazykem C++11 použijte unique_ptr
místo auto_ptr
. Další informace najdete v tématu unique_ptr
třída. auto_ptr
byl vyřazen v jazyce C++11 a odebrán v jazyce C++17.
Další informace o throw()
zpracování výjimek a zpracování výjimek naleznete v tématu Specifikace výjimek (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);
};
Parametry
right
Ze auto_ptr
kterého chcete získat existující prostředek.
ptr
Zadaný ukazatel pro nahrazení uloženého ukazatele.
Poznámky
Šablona třídy popisuje inteligentní ukazatel, který se nazývá , auto_ptr
k přidělenému objektu. Ukazatel musí mít hodnotu null nebo určit objekt přidělený new
. Přenese auto_ptr
vlastnictví, pokud je uložená hodnota přiřazena jinému objektu. (Nahradí uloženou hodnotu po přenosu ukazatelem null.) Destruktor pro auto_ptr<Type>
odstranění přiděleného objektu. Zajišťuje auto_ptr<Type>
, že přidělený objekt se automaticky odstraní, když ovládací prvek opustí blok, a to i prostřednictvím vyvolané výjimky. Neměli byste vytvářet dva auto_ptr<Type>
objekty, které vlastní stejný objekt.
Objekt můžete předat auto_ptr<Type>
hodnotou jako argument volání funkce. Nemůže auto_ptr
být prvkem žádného kontejneru standardní knihovny. Pomocí kontejneru standardní knihovny C++ nemůžete spolehlivě spravovat posloupnost auto_ptr<Type>
objektů.
Členové
Konstruktory
Název | Popis |
---|---|
auto_ptr |
Konstruktor pro objekty typu auto_ptr . |
Typedefs
Název | Popis |
---|---|
element_type |
Typ je synonymem pro parametr Type šablony . |
Funkce
Název | Popis |
---|---|
get |
Členová funkce vrátí uložený ukazatel myptr . |
release |
Člen nahradí uložený ukazatel myptr nulovým ukazatelem a vrátí dříve uložený ukazatel. |
reset |
Členová funkce vyhodnotí výraz delete myptr , ale pouze v případě, že uložená hodnota myptr ukazatele se změní v důsledku volání funkce. Potom nahradí uložený ukazatel ptr . |
Operátory
Název | Popis |
---|---|
operator= |
Operátor přiřazení, který převádí vlastnictví z jednoho auto_ptr objektu do druhého. |
operator* |
Operátor dereferencing pro objekty typu auto_ptr . |
operator-> |
Operátor pro povolení přístupu členů. |
operator auto_ptr<Other> |
Přetypuje z jednoho druhu auto_ptr na jiný druh auto_ptr . |
operator auto_ptr_ref<Other> |
Přetypuje z objektu do objektu auto_ptr auto_ptr_ref . |
auto_ptr
Konstruktor pro objekty 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
Ukazatel na objekt, který auto_ptr
zapouzdřuje.
right
Objekt auto_ptr
, který má být zkopírován konstruktorem.
Poznámky
První konstruktor je uložen ptr
v myptr
uloženém ukazateli na přidělený objekt. Druhý konstruktor přenese vlastnictví ukazatele uloženého v right
, uložením right
. vydanou v myptr
.
Třetí konstruktor se chová stejně jako druhý, s tím rozdílem, že ukládá right
. ref
. release
v myptr
, kde ref
je odkaz uložen v right
.
Konstruktor šablony se chová stejně jako druhý konstruktor, pokud ukazatel na Other
lze implicitně převést na ukazatel na Type
.
Příklad
// 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 je synonymem pro parametr Type
šablony .
typedef Type element _type;
get
Členová funkce vrátí uložený ukazatel myptr
.
Type *get() const throw();
Návratová hodnota
Uložený ukazatel myptr
.
Příklad
// 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=
Operátor přiřazení, který převádí vlastnictví z jednoho auto_ptr
objektu do druhého.
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
Objekt typu auto_ptr
.
Návratová hodnota
Odkaz na objekt typu auto_ptr<Type>
.
Poznámky
Přiřazení vyhodnotí výraz delete myptr
, ale pouze v případě, že se uložený ukazatel myptr
změní v důsledku přiřazení. Potom přenese vlastnictví ukazatele uloženého vpravo uložením práva.release
v myptr
. Funkce vrátí *this
.
Příklad
Příklad použití operátoru člena naleznete v tématu auto_ptr
.
operator*
Operátor dereferencing pro objekty typu auto_ptr
.
Type& operator*() const throw();
Návratová hodnota
Odkaz na objekt typu Type
, který vlastní ukazatel.
Poznámky
Operátor indirection vrátí *
get
. Uložený ukazatel proto nesmí být null.
Příklad
Příklad použití členské funkce naleznete v tématu auto_ptr
.
operator->
Operátor pro povolení přístupu členů.
Type * operator->() const throw();
Návratová hodnota
Člen objektu, který auto_ptr
vlastní.
Poznámky
Operátor výběru vrátí get
( )
výraz , aby se výraz ap
->member
chová stejně jako ( ap
. get
() )->member
, kde ap
je objekt třídyType
auto_ptr<
> . Uložený ukazatel proto nesmí být null a Type
musí být třída, struktura nebo sjednocující typ s member
členem.
Příklad
Příklad použití členské funkce naleznete v tématu auto_ptr
.
operator auto_ptr<Other>
Přetypuje z jednoho druhu auto_ptr
na jiný druh auto_ptr
.
template <class Other>
operator auto _ptr<Other>() throw();
Návratová hodnota
Operátor přetypování typu vrátí hodnotu auto_ptr<
Other>(*this)
.
Příklad
// 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>
Přetypuje z objektu do objektu auto_ptr
auto_ptr_ref
.
template <class Other>
operator auto _ptr _ref<Other>() throw();
Návratová hodnota
Operátor přetypování typu vrátí auto_ptr_refOther
<
>(*this)
.
Příklad
// 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
Člen nahradí uložený ukazatel myptr
nulovým ukazatelem a vrátí dříve uložený ukazatel.
Type *release() throw();
Návratová hodnota
Dříve uložený ukazatel.
Poznámky
Člen nahradí uložený ukazatel myptr
nulovým ukazatelem a vrátí dříve uložený ukazatel.
Příklad
// 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
Členová funkce vyhodnotí výraz delete myptr
, ale pouze v případě, že uložená hodnota myptr
ukazatele se změní v důsledku volání funkce. Potom nahradí uložený ukazatel ptr
.
void reset(Type* ptr = 0);
Parametry
ptr
Zadaný ukazatel pro nahrazení uloženého ukazatele myptr
.
Příklad
// 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