Bagikan melalui


Peringatan C26409

Hindari memanggil new dan delete secara eksplisit, gunakan std::make_unique<T> sebagai gantinya (r.11).

Bahkan jika kode bersih dari panggilan ke malloc dan , kami masih menyarankan agar Anda mempertimbangkan opsi yang lebih baik daripada penggunaan operatorfreenewdelete.

Pedoman Inti C++:
R.11: Hindari panggilan new dan delete secara eksplisit

Perbaikan utamanya adalah menggunakan penunjuk cerdas dan fungsi pabrik yang sesuai, seperti std::make_unique.

Keterangan

  • Pemeriksa memperingatkan panggilan ke semua jenis operator new atau delete: skalar, vektor, versi yang kelebihan beban (global dan khusus kelas), dan versi penempatan. Kasus penempatan new mungkin memerlukan beberapa klarifikasi dalam Panduan Inti untuk perbaikan yang disarankan, dan dapat dihilangkan di masa mendatang.

Nama analisis kode: NO_NEW_DELETE

Contoh

Contoh ini menunjukkan C26409 dinaikkan untuk eksplisit new dan delete. Pertimbangkan untuk menggunakan fungsi pabrik penunjuk cerdas seperti std::make_unique sebagai gantinya.

void f(int i)
{
    int* arr = new int[i]{}; // C26409, warning is issued for all new calls
    delete[] arr;            // C26409, warning is issued for all delete calls

    auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}

Ada idiom C++ yang memicu peringatan ini: delete this. Peringatan disengaja, karena Panduan Inti C++ mencegah pola ini. Anda dapat menekan peringatan dengan menggunakan atribut , seperti yang gsl::suppress ditunjukkan dalam contoh ini:

class MyReferenceCountingObject final
{
public:
    void AddRef();
    void Release() noexcept
    {
        ref_count_--;
        if (ref_count_ == 0)
        {
            [[gsl::suppress("i.11")]]
            delete this; 
        }
    }
private:
    unsigned int ref_count_{1};
};