unique_ptr
Kelas
Menyimpan pointer ke objek atau array yang dimiliki. Objek/array tidak dimiliki oleh .unique_ptr
Objek/array dihancurkan ketika unique_ptr
dihancurkan.
Sintaks
class unique_ptr {
public:
unique_ptr();
unique_ptr(nullptr_t Nptr);
explicit unique_ptr(pointer Ptr);
unique_ptr(pointer Ptr,
typename conditional<is_reference<Del>::value, Del,
typename add_reference<const Del>::type>::type Deleter);
unique_ptr(pointer Ptr,
typename remove_reference<Del>::type&& Deleter);
unique_ptr(unique_ptr&& Right);
template <class T2, Class Del2>
unique_ptr(unique_ptr<T2, Del2>&& Right);
unique_ptr(const unique_ptr& Right) = delete;
unique_ptr& operator=(const unique_ptr& Right) = delete;
};
//Specialization for arrays:
template <class T, class D>
class unique_ptr<T[], D> {
public:
typedef pointer;
typedef T element_type;
typedef D deleter_type;
constexpr unique_ptr() noexcept;
template <class U>
explicit unique_ptr(U p) noexcept;
template <class U>
unique_ptr(U p, see below d) noexcept;
template <class U>
unique_ptr(U p, see below d) noexcept;
unique_ptr(unique_ptr&& u) noexcept;
constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { } template <class U, class E>
unique_ptr(unique_ptr<U, E>&& u) noexcept;
~unique_ptr();
unique_ptr& operator=(unique_ptr&& u) noexcept;
template <class U, class E>
unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
unique_ptr& operator=(nullptr_t) noexcept;
T& operator[](size_t i) const;
pointer get() const noexcept;
deleter_type& get_deleter() noexcept;
const deleter_type& get_deleter() const noexcept;
explicit operator bool() const noexcept;
pointer release() noexcept;
void reset(pointer p = pointer()) noexcept;
void reset(nullptr_t = nullptr) noexcept;
template <class U>
void reset(U p) noexcept = delete;
void swap(unique_ptr& u) noexcept; // disable copy from lvalue unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
};
Parameter
Right
unique_ptr
.
Nptr
Jenis rvalue
std::nullptr_t
.
Ptr
pointer
.
Deleter
Fungsi deleter
yang terikat ke unique_ptr
.
Pengecualian
Tidak ada pengecualian yang dihasilkan oleh unique_ptr
.
Keterangan
Kelas unique_ptr
menggantikan auto_ptr
, dan dapat digunakan sebagai elemen kontainer Pustaka Standar C++.
Gunakan fungsi pembantu make_unique
untuk membuat instans baru secara efisien dari unique_ptr
.
unique_ptr
mengelola sumber daya secara unik. Setiap unique_ptr
objek menyimpan pointer ke objek yang dimilikinya atau menyimpan pointer null. Sumber daya dapat dimiliki oleh tidak lebih dari satu unique_ptr
objek; ketika objek yang memiliki unique_ptr
sumber daya tertentu dihancurkan, sumber daya dibebaskan. Objek unique_ptr
dapat dipindahkan, tetapi tidak disalin; untuk informasi selengkapnya, lihat Deklarator Referensi Rvalue: &&
.
Sumber daya dibesarkan dengan memanggil deleter
objek jenis Del
tersimpan yang mengetahui bagaimana sumber daya dialokasikan untuk tertentu unique_ptr
. Default deleter
default_delete<T>
mengasumsikan bahwa sumber daya yang dialokasikan oleh ptr
dialokasikan dengan new
, dan dapat dibebaskan dengan memanggil delete _Ptr
. (Spesialisasi unique_ptr<T[]>
parsial mengelola objek array yang dialokasikan dengan new[]
, dan memiliki default deleter
default_delete<T[]>
, khusus untuk memanggil delete[] ptr
.)
Pointer yang disimpan ke sumber daya yang dimiliki, stored_ptr
memiliki jenis pointer
. Ini Del::pointer
jika didefinisikan, dan T *
jika tidak. Objek stored_deleter
yang disimpan deleter
tidak menempati ruang dalam objek jika tanpa statusdeleter
. Perhatikan bahwa Del
bisa menjadi jenis referensi.
Anggota
Konstruktor
Nama | Deskripsi |
---|---|
unique_ptr |
Ada tujuh konstruktor untuk unique_ptr . |
Typedefs
Nama | Deskripsi |
---|---|
deleter_type |
Sinonim untuk parameter Del templat . |
element_type |
Sinonim untuk parameter T templat . |
pointer |
Sinonim untuk Del::pointer jika ditentukan, jika tidak T * . |
Fungsi
Nama | Deskripsi |
---|---|
get |
Menampilkan stored_ptr . |
get_deleter |
Mengembalikan referensi ke stored_deleter . |
release |
pointer() menyimpan dan stored_ptr mengembalikan isi sebelumnya. |
reset |
Merilis sumber daya yang saat ini dimiliki dan menerima sumber daya baru. |
swap |
Bertukar sumber daya dan deleter dengan yang disediakan unique_ptr . |
Operator
Nama | Deskripsi |
---|---|
operator bool |
Operator mengembalikan nilai jenis yang dapat dikonversi ke bool . Hasil konversi bool menjadi adalah true ketika get() != pointer() , jika tidak false . |
operator-> |
Fungsi anggota mengembalikan stored_ptr . |
operator* |
Fungsi anggota mengembalikan *stored_ptr . |
operator= |
Menetapkan nilai unique_ptr (atau a pointer-type ) ke saat ini unique_ptr . |
deleter_type
Jenisnya adalah sinonim untuk parameter Del
templat .
typedef Del deleter_type;
Keterangan
Jenisnya adalah sinonim untuk parameter Del
templat .
element_type
Jenisnya adalah sinonim untuk parameter Type
templat .
typedef Type element_type;
Keterangan
Jenisnya adalah sinonim untuk parameter Ty
templat .
get
Menampilkan stored_ptr
.
pointer get() const;
Keterangan
Fungsi anggota mengembalikan stored_ptr
.
get_deleter
Mengembalikan referensi ke stored_deleter
.
Del& get_deleter();
const Del& get_deleter() const;
Keterangan
Fungsi anggota mengembalikan referensi ke stored_deleter
.
operator=
Menetapkan alamat yang disediakan unique_ptr
untuk alamat saat ini.
unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);
Parameter
Referensi yang unique_ptr
digunakan untuk menetapkan nilai ke saat ini unique_ptr
.
Keterangan
Fungsi anggota memanggil reset(right.release())
dan pindah right.stored_deleter
ke stored_deleter
, lalu mengembalikan *this
.
pointer
Sinonim untuk Del::pointer
jika ditentukan, jika tidak Type *
.
typedef T1 pointer;
Keterangan
Jenisnya adalah sinonim untuk Del::pointer
jika ditentukan, jika tidak Type *
.
release
Merilis kepemilikan pointer tersimpan yang dikembalikan ke pemanggil dan mengatur nilai pointer tersimpan ke nullptr
.
pointer release();
Keterangan
Gunakan release
untuk mengambil alih kepemilikan pointer mentah yang disimpan oleh unique_ptr
. Pemanggil bertanggung jawab untuk menghapus pointer yang dikembalikan. unique-ptr
diatur ke status kosong yang dibangun default. Anda dapat menetapkan penunjuk lain dari jenis yang kompatibel ke unique_ptr
setelah panggilan ke release
.
Contoh
Contoh ini menunjukkan bagaimana pemanggil rilis bertanggung jawab atas objek yang dikembalikan:
// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>
struct Sample {
int content_;
Sample(int content) : content_(content) {
std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
}
~Sample() {
std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
}
};
void ReleaseUniquePointer() {
// Use make_unique function when possible.
auto up1 = std::make_unique<Sample>(3);
auto up2 = std::make_unique<Sample>(42);
// Take over ownership from the unique_ptr up2 by using release
auto ptr = up2.release();
if (up2) {
// This statement does not execute, because up2 is empty.
std::cout << "up2 is not empty." << std::endl;
}
// We are now responsible for deletion of ptr.
delete ptr;
// up1 deletes its stored pointer when it goes out of scope.
}
int main() {
ReleaseUniquePointer();
}
Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)
reset
Mengambil kepemilikan parameter pointer, lalu menghapus pointer asli yang disimpan. Jika pointer baru sama dengan pointer asli yang disimpan, reset
menghapus pointer dan mengatur pointer tersimpan ke nullptr
.
void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);
Parameter
ptr
Penunjuk ke sumber daya untuk mengambil kepemilikan.
Keterangan
Gunakan reset
untuk mengubah yang disimpan pointer
yang dimiliki oleh ke unique_ptr
ptr lalu hapus pointer asli yang disimpan. unique_ptr
Jika tidak kosong, reset
panggil fungsi deleter yang dikembalikan oleh get_deleter
pada pointer asli yang disimpan.
Karena reset
pertama-tama menyimpan pointer ptr
baru , lalu menghapus pointer asli yang disimpan, dimungkinkan untuk reset
segera menghapus ptr
jika sama dengan pointer asli yang disimpan.
swap
Menukar pointer di antara dua unique_ptr
objek.
void swap(unique_ptr& right);
Parameter
right
Digunakan unique_ptr
untuk menukar pointer.
Keterangan
Fungsi anggota bertukar stored_ptr
dengan right.stored_ptr
dan stored_deleter
dengan right.stored_deleter
.
unique_ptr
Ada tujuh konstruktor untuk unique_ptr
.
unique_ptr();
unique_ptr(nullptr_t);
explicit unique_ptr(pointer ptr);
unique_ptr(
Type* ptr,
typename conditional<
is_reference<Del>::value,
Del,
typename add_reference<const Del>::type>::type _Deleter);
unique_ptr(pointer ptr, typename remove_reference<Del>::type&& _Deleter);
unique_ptr(unique_ptr&& right);
template <class Ty2, Class Del2>
unique_ptr(unique_ptr<Ty2, Del2>&& right);
Parameter
ptr
Penunjuk ke sumber daya yang akan ditetapkan ke unique_ptr
.
_Deleter
yang deleter
akan ditetapkan ke unique_ptr
.
right
rvalue reference
ke unique_ptr
bidang tempat unique_ptr
pemindahan ditetapkan ke yang baru dibangun unique_ptr
.
Keterangan
Dua konstruktor pertama membuat objek yang tidak mengelola sumber daya. Konstruktor ketiga menyimpan ptr di stored_ptr
. Konstruktor keempat menyimpan ptr
dalam stored_ptr
dan deleter
di stored_deleter
.
Konstruktor kelima menyimpan ptr
dan stored_ptr
pindah deleter
ke stored_deleter
. Konstruktor keenam dan ketujuh menyimpan right.release()
dan stored_ptr
pindah right.get_deleter()
ke stored_deleter
.
~unique_ptr
Destruktor untuk unique_ptr
, menghancurkan unique_ptr
objek.
~unique_ptr();
Keterangan
Destruktor memanggil get_deleter()(stored_ptr)
.