Hanya pertanyaan kecil tentang shared_ptr
.
Apakah ini praktik yang baik untuk menggunakan shared_ptr
menunjuk ke array? Sebagai contoh,
shared_ptr<int> sp(new int[10]);
Jika tidak, mengapa tidak? Salah satu alasan saya sudah sadar adalah seseorang tidak dapat menambah / mengurangi shared_ptr
. Oleh karena itu tidak dapat digunakan seperti pointer normal ke array.
c++
c++11
shared-ptr
tshah06
sumber
sumber
std::vector
. Anda harus berhati-hati untuk menyebarkan array menggunakan referensi sehingga Anda tidak membuat salinannya. Sintaks untuk mengakses data lebih bersih daripada shared_ptr, dan mengubah ukurannya sangat sangat mudah. Dan Anda mendapatkan semua kebaikan STL jika Anda menginginkannya.std::array
. Ini hampir sama dengan array mentah, tetapi dengan semantik yang tepat untuk digunakan di sebagian besar komponen perpustakaan. Terutama benda-benda jenis itu dihancurkandelete
, bukandelete[]
. Dan tidak sepertivector
itu, ia menyimpan data secara langsung di objek, sehingga Anda tidak mendapatkan alokasi tambahan.Jawaban:
Dengan C ++ 17 ,
shared_ptr
dapat digunakan untuk mengelola array yang dialokasikan secara dinamis. Theshared_ptr
Template argumen dalam kasus ini harusT[N]
atauT[]
. Jadi, Anda bisa menulisDari n4659, [util.smartptr.shared.const]
Untuk mendukung ini, tipe anggota
element_type
sekarang didefinisikan sebagaiElemen array dapat diakses menggunakan
operator[]
Sebelum C ++ 17 ,
shared_ptr
bisa tidak digunakan untuk mengelola array dialokasikan secara dinamis. Secara default,shared_ptr
akan memanggildelete
objek yang dikelola ketika tidak ada lagi referensi yang tersisa. Namun, ketika Anda mengalokasikan menggunakannew[]
Anda perlu menelepondelete[]
, dan tidakdelete
, untuk membebaskan sumber daya.Untuk menggunakan
shared_ptr
array dengan benar, Anda harus menyediakan deleter khusus.Buat shared_ptr sebagai berikut:
Sekarang
shared_ptr
akan memanggil dengan benardelete[]
ketika menghancurkan objek yang dikelola.Deleter khusus di atas dapat diganti dengan
yang
std::default_delete
spesialisasi parsial untuk jenis berbagaiekspresi lambda
Selain itu, kecuali jika Anda benar-benar perlu berbagi keanggotaan objek yang dikelola, a
unique_ptr
lebih cocok untuk tugas ini, karena ia memiliki spesialisasi parsial untuk jenis array.Perubahan yang diperkenalkan oleh C ++ Extensions for Fundamentals Library
Alternatif pra-C ++ 17 lain dari yang tercantum di atas disediakan oleh Spesifikasi Teknis Dasar-Dasar Perpustakaan , yang ditambahkan
shared_ptr
untuk memungkinkannya bekerja di luar kotak untuk kasus-kasus ketika ia memiliki berbagai objek. Drafshared_ptr
perubahan yang dijadwalkan untuk TS ini saat ini dapat ditemukan di N4082 . Perubahan ini akan dapat diakses melaluistd::experimental
namespace, dan termasuk dalam<experimental/memory>
header. Beberapa perubahan yang relevan untuk mendukungshared_ptr
array adalah:- Definisi
element_type
perubahan tipe anggota- Anggota
operator[]
sedang ditambahkan- Berbeda dengan
unique_ptr
spesialisasi parsial untuk array, keduanyashared_ptr<T[]>
danshared_ptr<T[N]>
akan valid dan keduanya akan menghasilkandelete[]
dipanggil pada array objek yang dikelola.sumber
shared-array
.shared_ptr::get
mengembalikan pointer ke objek yang dikelola. Jadi Anda dapat menggunakannya sebagaisp.get()[0] = 1; ... sp.get()[9] = 10;
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
lihat juga en.cppreference.com/w/cpp/memory/default_deletestd::shared_ptr<std::array<int,N>>
harus cukup.unique_ptr
mendapatkan spesialisasi sebagian tetapishared_ptr
tidak?Alternatif yang mungkin lebih mudah yang mungkin bisa Anda gunakan adalah
shared_ptr<vector<int>>
.sumber
shared_ptr<array<int, 6>>
.