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.
Parameter pointer bersama diteruskan oleh referensi dan tidak diatur ulang atau ditetapkan ulang. Gunakan T* atau T& sebagai gantinya.
Pedoman Inti C++: R.35: Ambil<shared_ptr widget>& parameter untuk mengekspresikan bahwa fungsi mungkin memasang kembali pointer bersama
Meneruskan pointer bersama berdasarkan referensi mungkin berguna dalam skenario di mana kode yang disebut memperbarui target objek penunjuk pintar, dan pemanggilnya mengharapkan untuk melihat pembaruan tersebut. Menggunakan referensi hanya untuk mengurangi biaya melewati pointer bersama dipertanyakan. Jika kode yang dipanggil hanya mengakses objek target dan tidak pernah mengelola masa pakainya, lebih aman untuk meneruskan pointer atau referensi mentah, daripada mengekspos detail manajemen sumber daya.
Keterangan
Pemeriksaan ini mengenali
std::shared_pointerdan jenis yang ditentukan pengguna yang cenderung berperilaku seperti pointer bersama. Ciri-ciri berikut diharapkan untuk pointer bersama yang ditentukan pengguna:dereferensi berlebih atau operator akses anggota (publik dan tidak dihapus);
konstruktor salinan atau operator penugasan salinan (publik dan tidak dihapus);
destruktor publik yang tidak dihapus atau default. Destruktor kosong masih dihitung sebagai ditentukan pengguna.
Tindakan mereset atau menetapkan ulang ditafsirkan dengan cara yang lebih umum:
setiap panggilan ke fungsi non-konstan pada pointer bersama berpotensi mengatur ulang pointer;
setiap panggilan ke fungsi yang menerima referensi ke pointer bersama non-konstan dapat berpotensi mengatur ulang atau menetapkan ulang penunjuk tersebut.
Contoh
komplikasi antarmuka yang tidak perlu
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
komplikasi antarmuka yang tidak perlu - disederhanakan
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}