Udostępnij za pośrednictwem


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

Zobacz też

unique_ptr Class