Bagikan melalui


kelas auto_ptr

Membungkus pointer pintar di sekitar sumber daya yang memastikan sumber daya dihancurkan secara otomatis saat kontrol meninggalkan blok.

Mulai dari C++11, gunakan unique_ptr alih-alih auto_ptr. Untuk informasi selengkapnya, lihat unique_ptr kelas. auto_ptr tidak digunakan lagi di C++11 dan dihapus di C++17.

Untuk informasi selengkapnya tentang throw() dan penanganan pengecualian, lihat Spesifikasi Pengecualian (throw).

Sintaks

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
dari auto_ptr mana untuk mendapatkan sumber daya yang ada.

ptr
Penunjuk ditentukan untuk mengganti penunjuk yang disimpan.

Keterangan

Templat kelas menjelaskan penunjuk cerdas, yang auto_ptrdisebut , ke objek yang dialokasikan. Penunjuk harus null atau menunjuk objek yang dialokasikan oleh new. Mentransfer auto_ptr kepemilikan jika nilai tersimpannya ditetapkan ke objek lain. (Ini menggantikan nilai tersimpan setelah transfer dengan pointer null.) Destruktor untuk auto_ptr<Type> menghapus objek yang dialokasikan. auto_ptr<Type> memastikan bahwa objek yang dialokasikan secara otomatis dihapus ketika kontrol meninggalkan blok, bahkan melalui pengecualian yang dilemparkan. Anda tidak boleh membuat dua auto_ptr<Type> objek yang memiliki objek yang sama.

Anda dapat meneruskan auto_ptr<Type> objek menurut nilai sebagai argumen ke panggilan fungsi. auto_ptr Tidak dapat menjadi elemen dari kontainer Pustaka Standar apa pun. Anda tidak dapat mengelola urutan auto_ptr<Type> objek dengan kontainer Pustaka Standar C++ dengan andal.

Anggota

Konstruktor

Nama Deskripsi
auto_ptr Konstruktor untuk objek jenis auto_ptr.

Typedefs

Nama Deskripsi
element_type Jenisnya adalah sinonim untuk parameter Typetemplat .

Fungsi

Nama Deskripsi
get Fungsi anggota mengembalikan penunjuk tersimpan myptr.
release Anggota mengganti pointer yang disimpan dengan pointer myptr null dan mengembalikan pointer yang disimpan sebelumnya.
reset Fungsi anggota mengevaluasi ekspresi delete myptr, tetapi hanya jika nilai myptr pointer yang disimpan berubah sebagai akibat dari panggilan fungsi. Kemudian mengganti pointer yang disimpan dengan ptr.

Operator

Nama Deskripsi
operator= Operator penugasan yang mentransfer kepemilikan dari satu auto_ptr objek ke objek lainnya.
operator* Operator dereferensi untuk objek jenis auto_ptr.
operator-> Operator untuk mengizinkan akses anggota.
operator auto_ptr<Other> Melemparkan dari satu jenis ke jenis auto_ptr lain .auto_ptr
operator auto_ptr_ref<Other> Melemparkan dari ke auto_ptr auto_ptr_ref.

auto_ptr

Konstruktor untuk objek jenis 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
Penunjuk ke objek yang auto_ptr merangkum.

right
Objek auto_ptr yang akan disalin oleh konstruktor.

Keterangan

Konstruktor pertama disimpan ptr di myptr, pointer tersimpan ke objek yang dialokasikan. Konstruktor kedua mentransfer kepemilikan pointer yang disimpan di right, dengan menyimpan right. rilis di myptr.

Konstruktor ketiga berperilaku sama dengan yang kedua, kecuali bahwa konstruktor menyimpan right. ref. release di myptr, di mana ref referensi disimpan dalam right.

Konstruktor templat berperilaku sama dengan konstruktor kedua, jika penunjuk Other dapat dikonversi secara implisit ke penunjuk ke Type.

Contoh

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

Jenisnya adalah sinonim untuk parameter Typetemplat .

typedef Type element  _type;

get

Fungsi anggota mengembalikan penunjuk tersimpan myptr.

Type *get() const throw();

Tampilkan Nilai

Penunjuk tersimpan myptr.

Contoh

// 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 penugasan yang mentransfer kepemilikan dari satu auto_ptr objek ke objek lainnya.

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
Objek jenis auto_ptr.

Tampilkan Nilai

Referensi ke objek jenis auto_ptr<Type>.

Keterangan

Penetapan mengevaluasi ekspresi delete myptr, tetapi hanya jika penunjuk myptr tersimpan berubah sebagai akibat dari penugasan. Kemudian mentransfer kepemilikan pointer yang disimpan di sebelah kanan, dengan menyimpan dengan benar.release di myptr. Fungsi mengembalikan *this.

Contoh

Untuk contoh penggunaan operator anggota, lihat auto_ptr.

operator*

Operator dereferensi untuk objek jenis auto_ptr.

Type& operator*() const throw();

Tampilkan Nilai

Referensi ke objek jenis Type yang dimiliki penunjuk.

Keterangan

Operator tidak langsung mengembalikan *get. Oleh karena itu, pointer yang disimpan tidak boleh null.

Contoh

Untuk contoh cara menggunakan fungsi anggota, lihat auto_ptr.

operator->

Operator untuk mengizinkan akses anggota.

Type * operator->() const throw();

Tampilkan Nilai

Anggota objek yang auto_ptr dimiliki.

Keterangan

Operator pemilihan mengembalikan get( ), sehingga ekspresi ap->member berulah sama dengan ( ap. get() )->member, di mana ap adalah objek kelasTypeauto_ptr<> . Oleh karena itu, pointer yang disimpan tidak boleh null, dan Type harus merupakan jenis kelas, struct, atau union dengan member anggota.

Contoh

Untuk contoh cara menggunakan fungsi anggota, lihat auto_ptr.

operator auto_ptr<Other>

Melemparkan dari satu jenis ke jenis auto_ptr lain .auto_ptr

template <class Other>
operator auto _ptr<Other>() throw();

Tampilkan Nilai

Operator jenis cast mengembalikan auto_ptr<Lainnya>(*this).

Contoh

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

Melemparkan dari ke auto_ptr auto_ptr_ref.

template <class Other>
operator auto _ptr  _ref<Other>() throw();

Tampilkan Nilai

Operator jenis cast mengembalikan auto_ptr_refOther<>(*this).

Contoh

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

Anggota mengganti pointer yang disimpan dengan pointer myptr null dan mengembalikan pointer yang disimpan sebelumnya.

Type *release() throw();

Tampilkan Nilai

Pointer yang disimpan sebelumnya.

Keterangan

Anggota mengganti pointer yang disimpan dengan pointer myptr null dan mengembalikan pointer yang disimpan sebelumnya.

Contoh

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

Fungsi anggota mengevaluasi ekspresi delete myptr, tetapi hanya jika nilai myptr pointer yang disimpan berubah sebagai akibat dari panggilan fungsi. Kemudian mengganti pointer yang disimpan dengan ptr.

void reset(Type* ptr = 0);

Parameter

ptr
Penunjuk ditentukan untuk mengganti penunjuk tersimpan myptr.

Contoh

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

Lihat juga

unique_ptr Class