Bagikan melalui


Peringatan C26417

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_pointer dan 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());
    // ...
}