shared_ptr
kelas
Membungkus penunjuk cerdas yang dihitung referensi di sekitar objek yang dialokasikan secara dinamis.
Sintaks
template <class T>
class shared_ptr;
Keterangan
Kelas menjelaskan shared_ptr
objek yang menggunakan penghitungan referensi untuk mengelola sumber daya. Objek shared_ptr
secara efektif menyimpan pointer ke sumber daya yang dimilikinya atau menyimpan pointer null. Sumber daya dapat dimiliki oleh lebih dari satu shared_ptr
objek; ketika objek terakhir shared_ptr
yang memiliki sumber daya tertentu dihancurkan, sumber daya dibebaskan.
Berhenti shared_ptr
memiliki sumber daya saat ditetapkan ulang atau diatur ulang.
Argumen T
templat mungkin merupakan jenis yang tidak lengkap kecuali sebagaimana dicatat untuk fungsi anggota tertentu.
shared_ptr<T>
Ketika objek dibangun dari penunjuk sumber daya jenis G*
atau dari shared_ptr<G>
, jenis G*
penunjuk harus dapat dikonversi ke T*
. Jika tidak dapat dikonversi, kode tidak akan dikompilasi. Contohnya:
#include <memory>
using namespace std;
class F {};
class G : public F {};
shared_ptr<G> sp0(new G); // okay, template parameter G and argument G*
shared_ptr<G> sp1(sp0); // okay, template parameter G and argument shared_ptr<G>
shared_ptr<F> sp2(new G); // okay, G* convertible to F*
shared_ptr<F> sp3(sp0); // okay, template parameter F and argument shared_ptr<G>
shared_ptr<F> sp4(sp2); // okay, template parameter F and argument shared_ptr<F>
shared_ptr<int> sp5(new G); // error, G* not convertible to int*
shared_ptr<int> sp6(sp2); // error, template parameter int and argument shared_ptr<F>
Objek shared_ptr
memiliki sumber daya:
jika dibangun dengan penunjuk ke sumber daya tersebut,
jika dibangun dari objek yang memiliki
shared_ptr
sumber daya tersebut,jika dibuat dari
weak_ptr
objek yang menunjuk ke sumber daya tersebut, ataujika kepemilikan sumber daya tersebut ditetapkan untuk sumber daya tersebut, baik dengan atau dengan
shared_ptr::operator=
memanggil fungsishared_ptr::reset
anggota .
Objek shared_ptr
yang memiliki sumber daya berbagi blok kontrol. Blok kontrol menahan:
jumlah
shared_ptr
objek yang memiliki sumber daya,jumlah
weak_ptr
objek yang menunjuk ke sumber daya,penghapusan untuk sumber daya tersebut jika memilikinya,
alokator kustom untuk blok kontrol jika memilikinya.
Objek shared_ptr
yang diinisialisasi dengan menggunakan pointer null memiliki blok kontrol dan tidak kosong. Setelah objek shared_ptr
merilis sumber daya, objek tersebut tidak lagi memiliki sumber daya tersebut. weak_ptr
Setelah objek merilis sumber daya, objek tidak lagi menunjuk ke sumber daya tersebut.
Ketika jumlah shared_ptr
objek yang memiliki sumber daya menjadi nol, sumber daya dibesarkan, baik dengan menghapusnya atau dengan meneruskan alamatnya ke penghapus, tergantung pada bagaimana kepemilikan sumber daya awalnya dibuat. Ketika jumlah shared_ptr
objek yang memiliki sumber daya adalah nol, dan jumlah weak_ptr
objek yang menunjuk ke sumber daya tersebut adalah nol, blok kontrol dibeberkan, menggunakan alokator kustom untuk blok kontrol jika memilikinya.
Objek kosong shared_ptr
tidak memiliki sumber daya apa pun dan tidak memiliki blok kontrol.
Deleter adalah objek fungsi yang memiliki fungsi operator()
anggota . Jenisnya harus dapat disalin, dan konstruktor dan destruktor salinannya tidak boleh melemparkan pengecualian. Ini menerima satu parameter, objek yang akan dihapus.
Beberapa fungsi mengambil daftar argumen yang menentukan properti dari objek atau weak_ptr<T>
yang dihasilkanshared_ptr<T>
. Anda dapat menentukan daftar argumen seperti itu dengan beberapa cara:
tidak ada argumen: Objek yang dihasilkan adalah objek kosong shared_ptr
atau objek kosong weak_ptr
.
ptr
: Penunjuk jenis Other*
ke sumber daya yang akan dikelola. T
harus berupa jenis lengkap. Jika fungsi gagal (karena blok kontrol tidak dapat dialokasikan), fungsi akan mengevaluasi ekspresi delete ptr
.
ptr, deleter
: Penunjuk jenis Other*
ke sumber daya yang akan dikelola dan penghapusan untuk sumber daya tersebut. Jika fungsi gagal (karena blok kontrol tidak dapat dialokasikan), fungsi deleter(ptr)
memanggil , yang harus ditentukan dengan baik.
ptr, deleter, alloc
: Penunjuk jenis Other*
ke sumber daya yang akan dikelola, penghapusan untuk sumber daya tersebut, dan alokator untuk mengelola penyimpanan apa pun yang harus dialokasikan dan dibebaskan. Jika fungsi gagal (karena blok kontrol tidak dapat dialokasikan), fungsi deleter(ptr)
memanggil , yang harus ditentukan dengan baik.
sp
: Objek shared_ptr<Other>
yang memiliki sumber daya yang akan dikelola.
wp
: Objek weak_ptr<Other>
yang menunjuk ke sumber daya yang akan dikelola.
ap
: Objek auto_ptr<Other>
yang menyimpan pointer ke sumber daya yang akan dikelola. Jika fungsi berhasil, fungsi akan memanggil ap.release()
; jika tidak, fungsi tersebut tidak ap
berubah.
Dalam semua kasus, jenis Other*
pointer harus dapat dikonversi ke T*
.
Keamanan Thread
Beberapa utas dapat membaca dan menulis objek yang berbeda shared_ptr
secara bersamaan, bahkan ketika objek disalin yang berbagi kepemilikan.
Anggota
Nama | Deskripsi |
---|---|
Konstruktor | |
shared_ptr |
Membangun sebuah shared_ptr . |
~shared_ptr |
shared_ptr Menghancurkan . |
Typedefs | |
element_type |
Jenis elemen. |
weak_type |
Jenis penunjuk lemah ke elemen. |
Fungsi anggota | |
get |
Mendapatkan alamat sumber daya yang dimiliki. |
owner_before |
Mengembalikan true jika ini shared_ptr diurutkan sebelum (atau kurang dari) pointer yang disediakan. |
reset |
Ganti sumber daya yang dimiliki. |
swap |
Tukar dua shared_ptr objek. |
unique |
Pengujian jika sumber daya yang dimiliki unik. |
use_count |
Menghitung jumlah pemilik sumber daya. |
Operator | |
operator bool |
Menguji apakah sumber daya yang dimiliki ada. |
operator* |
Mendapatkan nilai yang ditunjuk. |
operator= |
Menggantikan sumber daya yang dimiliki. |
operator-> |
Mendapatkan penunjuk ke nilai yang ditunjuk. |
element_type
Jenis elemen.
typedef T element_type; // before C++17
using element_type = remove_extent_t<T>; // C++17
Keterangan
element_type
Jenisnya adalah sinonim untuk parameter T
templat .
Contoh
// std__memory__shared_ptr_element_type.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0(new int(5));
std::shared_ptr<int>::element_type val = *sp0;
std::cout << "*sp0 == " << val << std::endl;
return (0);
}
*sp0 == 5
get
Mendapatkan alamat sumber daya yang dimiliki.
element_type* get() const noexcept;
Keterangan
Fungsi anggota mengembalikan alamat sumber daya yang dimiliki. Jika objek tidak memiliki sumber daya, objek akan mengembalikan 0.
Contoh
// std__memory__shared_ptr_get.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0;
std::shared_ptr<int> sp1(new int(5));
std::cout << "sp0.get() == 0 == " << std::boolalpha
<< (sp0.get() == 0) << std::endl;
std::cout << "*sp1.get() == " << *sp1.get() << std::endl;
return (0);
}
sp0.get() == 0 == true
*sp1.get() == 5
operator bool
Menguji apakah sumber daya yang dimiliki ada.
explicit operator bool() const noexcept;
Keterangan
Operator mengembalikan nilai ketika true
get() != nullptr
, jika tidak false
.
Contoh
// std__memory__shared_ptr_operator_bool.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0;
std::shared_ptr<int> sp1(new int(5));
std::cout << "(bool)sp0 == " << std::boolalpha
<< (bool)sp0 << std::endl;
std::cout << "(bool)sp1 == " << std::boolalpha
<< (bool)sp1 << std::endl;
return (0);
}
(bool)sp0 == false
(bool)sp1 == true
operator*
Mendapatkan nilai yang ditunjuk.
T& operator*() const noexcept;
Keterangan
Operator tidak langsung mengembalikan *get()
. Oleh karena itu, pointer yang disimpan tidak boleh null.
Contoh
// std__memory__shared_ptr_operator_st.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0(new int(5));
std::cout << "*sp0 == " << *sp0 << std::endl;
return (0);
}
*sp0 == 5
operator=
Menggantikan sumber daya yang dimiliki.
shared_ptr& operator=(const shared_ptr& sp) noexcept;
shared_ptr& operator=(shared_ptr&& sp) noexcept;
template <class Other>
shared_ptr& operator=(const shared_ptr<Other>& sp) noexcept;
template <class Other>
shared_ptr& operator=(shared_ptr<Other>&& sp) noexcept;
template <class Other>
shared_ptr& operator=(auto_ptr<Other>&& ap); // deprecated in C++11, removed in C++17
template <class Other, class Deleter>
shared_ptr& operator=(unique_ptr<Other, Deleter>&& up);
Parameter
sp
Penunjuk bersama untuk disalin atau dipindahkan.
ap
Penunjuk otomatis untuk dipindahkan. Kelebihan auto_ptr
beban tidak digunakan lagi di C++11 dan dihapus di C++17.
up
Pointer unik ke objek untuk mengadopsi kepemilikan. up
tidak memiliki objek setelah panggilan.
Other
Jenis objek yang ditujukkan oleh sp
, , ap
atau up
.
Deleter
Jenis penghapusan objek yang dimiliki, disimpan untuk penghapusan objek nanti.
Keterangan
Semua operator mengurangi jumlah referensi untuk sumber daya yang saat ini dimiliki oleh *this
dan menetapkan kepemilikan sumber daya yang dinamai menurut urutan operand ke *this
. Jika jumlah referensi jatuh ke nol, sumber daya akan dirilis. Jika operator gagal, operator *this
tidak berubah.
Contoh
// std__memory__shared_ptr_operator_as.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0;
std::shared_ptr<int> sp1(new int(5));
std::unique_ptr<int> up(new int(10));
sp0 = sp1;
std::cout << "*sp0 == " << *sp0 << std::endl;
sp0 = up;
std::cout << "*sp0 == " << *sp0 << std::endl;
return (0);
}
*sp0 == 5
*sp0 == 10
operator->
Mendapatkan penunjuk ke nilai yang ditunjuk.
T* operator->() const noexcept;
Keterangan
Operator pilihan mengembalikan get()
, sehingga ekspresi sp->member
bersifat sama seperti (sp.get())->member
di mana sp
adalah objek kelas shared_ptr<T>
. Oleh karena itu, pointer yang disimpan tidak boleh null, dan T
harus merupakan jenis kelas, struktur, atau gabungan dengan anggota member
.
Contoh
// std__memory__shared_ptr_operator_ar.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
typedef std::pair<int, int> Mypair;
int main()
{
std::shared_ptr<Mypair> sp0(new Mypair(1, 2));
std::cout << "sp0->first == " << sp0->first << std::endl;
std::cout << "sp0->second == " << sp0->second << std::endl;
return (0);
}
sp0->first == 1
sp0->second == 2
owner_before
Mengembalikan true jika ini shared_ptr
diurutkan sebelum (atau kurang dari) pointer yang disediakan.
template <class Other>
bool owner_before(const shared_ptr<Other>& ptr) const noexcept;
template <class Other>
bool owner_before(const weak_ptr<Other>& ptr) const noexcept;
Parameter
ptr
Referensi lvalue ke shared_ptr
atau weak_ptr
.
Keterangan
Fungsi anggota templat mengembalikan true jika *this
diurutkan sebelum ptr
.
reset
Ganti sumber daya yang dimiliki.
void reset() noexcept;
template <class Other>
void reset(Other *ptr);
template <class Other, class Deleter>
void reset(
Other *ptr,
Deleter deleter);
template <class Other, class Deleter, class Allocator>
void reset(
Other *ptr,
Deleter deleter,
Allocator alloc);
Parameter
Other
Jenis yang dikontrol oleh penunjuk argumen.
Deleter
Jenis penghapusan.
ptr
Penunjuk untuk disalin.
deleter
Penghapusan yang akan disalin.
Allocator
Jenis alokator.
alloc
Alokator untuk disalin.
Keterangan
Semua operator mengurangi jumlah referensi untuk sumber daya yang saat ini dimiliki oleh *this
dan menetapkan kepemilikan sumber daya yang dinamai menurut urutan operand ke *this
. Jika jumlah referensi jatuh ke nol, sumber daya akan dirilis. Jika operator gagal, operator *this
tidak berubah.
Contoh
// std__memory__shared_ptr_reset.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
struct deleter
{
void operator()(int *p)
{
delete p;
}
};
int main()
{
std::shared_ptr<int> sp(new int(5));
std::cout << "*sp == " << std::boolalpha
<< *sp << std::endl;
sp.reset();
std::cout << "(bool)sp == " << std::boolalpha
<< (bool)sp << std::endl;
sp.reset(new int(10));
std::cout << "*sp == " << std::boolalpha
<< *sp << std::endl;
sp.reset(new int(15), deleter());
std::cout << "*sp == " << std::boolalpha
<< *sp << std::endl;
return (0);
}
*sp == 5
(bool)sp == false
*sp == 10
*sp == 15
shared_ptr
Membangun sebuah shared_ptr
.
constexpr shared_ptr() noexcept;
constexpr shared_ptr(nullptr_t) noexcept : shared_ptr() {}
shared_ptr(const shared_ptr& sp) noexcept;
shared_ptr(shared_ptr&& sp) noexcept;
template <class Other>
explicit shared_ptr(Other* ptr);
template <class Other, class Deleter>
shared_ptr(
Other* ptr,
Deleter deleter);
template <class Deleter>
shared_ptr(
nullptr_t ptr,
Deleter deleter);
template <class Other, class Deleter, class Allocator>
shared_ptr(
Other* ptr,
Deleter deleter,
Allocator alloc);
template <class Deleter, class Allocator>
shared_ptr(
nullptr_t ptr,
Deleter deleter,
Allocator alloc);
template <class Other>
shared_ptr(
const shared_ptr<Other>& sp) noexcept;
template <class Other>
explicit shared_ptr(
const weak_ptr<Other>& wp);
template <class &>
shared_ptr(
std::auto_ptr<Other>& ap);
template <class &>
shared_ptr(
std::auto_ptr<Other>&& ap);
template <class Other, class Deleter>
shared_ptr(
unique_ptr<Other, Deleter>&& up);
template <class Other>
shared_ptr(
const shared_ptr<Other>& sp,
element_type* ptr) noexcept;
template <class Other>
shared_ptr(
shared_ptr<Other>&& sp,
element_type* ptr) noexcept;
template <class Other, class Deleter>
shared_ptr(
const unique_ptr<Other, Deleter>& up) = delete;
Parameter
Other
Jenis yang dikontrol oleh penunjuk argumen.
ptr
Penunjuk untuk disalin.
Deleter
Jenis penghapusan.
Allocator
Jenis alokator.
deleter
Penghapusan.
alloc
Alokator.
sp
Penunjuk cerdas untuk disalin.
wp
Penunjuk yang lemah.
ap
Penunjuk otomatis untuk disalin.
Keterangan
Konstruktor masing-masing membuat objek yang memiliki sumber daya yang dinamai oleh urutan operand. Konstruktor shared_ptr(const weak_ptr<Other>& wp)
melempar objek pengecualian jenis bad_weak_ptr
jika wp.expired()
.
Contoh
// std__memory__shared_ptr_construct.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
struct deleter
{
void operator()(int *p)
{
delete p;
}
};
int main()
{
std::shared_ptr<int> sp0;
std::cout << "(bool)sp0 == " << std::boolalpha
<< (bool)sp0 << std::endl;
std::shared_ptr<int> sp1(new int(5));
std::cout << "*sp1 == " << *sp1 << std::endl;
std::shared_ptr<int> sp2(new int(10), deleter());
std::cout << "*sp2 == " << *sp2 << std::endl;
std::shared_ptr<int> sp3(sp2);
std::cout << "*sp3 == " << *sp3 << std::endl;
std::weak_ptr<int> wp(sp3);
std::shared_ptr<int> sp4(wp);
std::cout << "*sp4 == " << *sp4 << std::endl;
std::auto_ptr<int> ap(new int(15));
std::shared_ptr<int> sp5(ap);
std::cout << "*sp5 == " << *sp5 << std::endl;
return (0);
}
(bool)sp0 == false
*sp1 == 5
*sp2 == 10
*sp3 == 10
*sp4 == 10
*sp5 == 15
~shared_ptr
shared_ptr
Menghancurkan .
~shared_ptr();
Keterangan
Destruktor mengurangi jumlah referensi untuk sumber daya yang saat ini dimiliki oleh *this
. Jika jumlah referensi jatuh ke nol, sumber daya akan dirilis.
Contoh
// std__memory__shared_ptr_destroy.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::cout << "*sp1 == " << *sp1 << std::endl;
std::cout << "use count == " << sp1.use_count() << std::endl;
{
std::shared_ptr<int> sp2(sp1);
std::cout << "*sp2 == " << *sp2 << std::endl;
std::cout << "use count == " << sp1.use_count() << std::endl;
}
// check use count after sp2 is destroyed
std::cout << "use count == " << sp1.use_count() << std::endl;
return (0);
}
*sp1 == 5
use count == 1
*sp2 == 5
use count == 2
use count == 1
swap
Tukar dua shared_ptr
objek.
void swap(shared_ptr& sp) noexcept;
Parameter
sp
Penunjuk bersama untuk ditukar.
Keterangan
Fungsi anggota meninggalkan sumber daya yang awalnya dimiliki oleh *this
kemudian dimiliki oleh sp
, dan sumber daya yang awalnya dimiliki oleh sp
kemudian dimiliki oleh *this
. Fungsi ini tidak mengubah jumlah referensi untuk dua sumber daya dan tidak melemparkan pengecualian apa pun.
Contoh
// std__memory__shared_ptr_swap.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::shared_ptr<int> sp2(new int(10));
std::cout << "*sp1 == " << *sp1 << std::endl;
sp1.swap(sp2);
std::cout << "*sp1 == " << *sp1 << std::endl;
swap(sp1, sp2);
std::cout << "*sp1 == " << *sp1 << std::endl;
std::cout << std::endl;
std::weak_ptr<int> wp1(sp1);
std::weak_ptr<int> wp2(sp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
wp1.swap(wp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
swap(wp1, wp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
return (0);
}
*sp1 == 5
*sp1 == 10
*sp1 == 5
*wp1 == 5
*wp1 == 10
*wp1 == 5
unique
Pengujian jika sumber daya yang dimiliki unik. Fungsi ini tidak digunakan lagi di C++17, dan dihapus di C++20.
bool unique() const noexcept;
Keterangan
Fungsi anggota mengembalikan true
jika tidak ada objek lain shared_ptr
yang memiliki sumber daya yang dimiliki oleh *this
, jika tidak false
.
Contoh
// std__memory__shared_ptr_unique.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::cout << "sp1.unique() == " << std::boolalpha
<< sp1.unique() << std::endl;
std::shared_ptr<int> sp2(sp1);
std::cout << "sp1.unique() == " << std::boolalpha
<< sp1.unique() << std::endl;
return (0);
}
sp1.unique() == true
sp1.unique() == false
use_count
Menghitung jumlah pemilik sumber daya.
long use_count() const noexcept;
Keterangan
Fungsi anggota mengembalikan jumlah shared_ptr
objek yang memiliki sumber daya yang dimiliki oleh *this
.
Contoh
// std__memory__shared_ptr_use_count.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::cout << "sp1.use_count() == "
<< sp1.use_count() << std::endl;
std::shared_ptr<int> sp2(sp1);
std::cout << "sp1.use_count() == "
<< sp1.use_count() << std::endl;
return (0);
}
sp1.use_count() == 1
sp1.use_count() == 2
weak_type
Jenis penunjuk lemah ke elemen.
using weak_type = weak_ptr<T>; // C++17
Keterangan
Definisi weak_type
ditambahkan dalam C++17.