Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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