Bagikan melalui


Peringatan C26401

Jangan hapus pointer mentah yang bukan owner<T> (i.11)

Keterangan

Pemeriksaan ini mendeteksi kode tempat pemindahan owner<T> dapat menjadi opsi yang baik untuk tahap pertama pemfaktoran ulang. Seperti C26400, ini memberlakukan aturan I.11 dan R.3, tetapi berfokus pada bagian "rilis" dari masa pakai pointer. Ini memperingatkan pada setiap panggilan ke operator delete jika targetnya bukan owner<T> atau pemilik yang diasumsikan secara implisit. Untuk informasi selengkapnya tentang auto deklarasi, lihat C26400. Pemeriksaan ini mencakup ekspresi yang mengacu pada variabel global, parameter formal, dan sebagainya.

Peringatan C26400 dan C26401 selalu terjadi dengan C26409, tetapi lebih sesuai untuk skenario di mana migrasi langsung ke penunjuk pintar tidak layak. Dalam kasus seperti itu owner<T> , konsep dapat diadopsi terlebih dahulu, dan C26409 dapat ditekan sementara.

Nama analisis kode: DONT_DELETE_NON_OWNER

Lihat juga

C++ Panduan Inti I.11

Contoh

struct myStruct {};

myStruct* createMyStruct();
void function()
{
    myStruct* pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}

Lihat bahwa C26401 dihapus jika kepemilikan pointer ditunjukkan oleh gsl::owner.

#include <gsl/pointers>
struct myStruct {};

gsl::owner<myStruct*> createMyStruct();
void function()
{
    gsl::owner<myStruct*> pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // no warning.
}

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};
};