Bagikan melalui


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 rvaluestd::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 deleterdefault_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 deleterdefault_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 Deltemplat .
element_type Sinonim untuk parameter Ttemplat .
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.

Operators

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

typedef Del deleter_type;

Keterangan

Jenisnya adalah sinonim untuk parameter Deltemplat .

element_type

Jenisnya adalah sinonim untuk parameter Typetemplat .

typedef Type element_type;

Keterangan

Jenisnya adalah sinonim untuk parameter Tytemplat .

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_ptrptr 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 ptrbaru , 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).