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 penunjuk pintar hanya digunakan untuk mengakses pointer yang terkandung. Gunakan T* atau T& sebagai gantinya.
Pedoman Inti C++: R.30: Ambil pointer pintar sebagai parameter hanya untuk mengekspresikan semantik seumur hidup secara eksplisit
Menggunakan jenis penunjuk cerdas untuk meneruskan data ke fungsi menunjukkan bahwa fungsi target perlu mengelola masa pakai objek yang terkandung. Namun, katakanlah fungsi hanya menggunakan penunjuk pintar untuk mengakses objek yang terkandung dan tidak pernah benar-benar memanggil kode apa pun yang dapat menyebabkan dealokasinya (artinya, tidak pernah memengaruhi masa pakainya). Maka biasanya tidak perlu mempersulit antarmuka dengan pointer pintar. Penunjuk biasa atau referensi ke objek yang terkandung lebih disukai.
Keterangan
Pemeriksaan ini mencakup sebagian besar skenario yang juga menyebabkan C26410, C26415, C26417, dan C26418. Lebih baik membersihkan SMART_PTR_NOT_NEEDED terlebih dahulu dan kemudian beralih ke kasus tepi untuk pointer bersama atau unik. Untuk pembersihan yang lebih terfokus, peringatan ini dapat dinonaktifkan.
Selain templat std::unqiue_pointer dan std::shared_pointer standar, pemeriksaan ini mengenali jenis yang ditentukan pengguna yang kemungkinan dimaksudkan untuk menjadi penunjuk cerdas. Jenis tersebut diharapkan untuk menentukan operasi berikut:
- Dereferensi berlebih atau operator akses anggota yang bersifat publik dan tidak ditandai sebagai dihapus.
- Destruktor publik yang tidak dihapus atau default, termasuk destruktor yang secara eksplisit didefinisikan kosong.
Interpretasi operasi yang dapat memengaruhi masa pakai objek yang terkandung luas dan mencakup:
- Fungsi apa pun yang menerima penunjuk atau parameter referensi ke penunjuk cerdas non-konstan
- Menyalin atau memindahkan konstruktor atau operator penugasan
- Fungsi non-konstanta
Contoh
Manajemen seumur hidup yang rumit.
bool set_initial_message(
const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
if (!m || initial_message_)
return false;
initial_message_.reset(m.get());
return true;
}
void pass_message(const message_info &info)
{
auto m = std::make_unique<message>(info);
const auto release = set_initial_message(m);
// ...
if (release)
m.release();
}
Manajemen seumur hidup yang rumit - dikerjakan ulang.
void set_initial_message(std::shared_ptr<message> m) noexcept
{
if (m && !initial_message_)
initial_message_ = std::move(m);
}
void pass_message(const message_info &info)
{
auto m = std::make_shared<message>(info);
set_initial_message(m);
// ...
}