Megosztás:


Figyelmeztetés C26409

Kerülje el new és delete kifejezetten hívását, helyette használja a std::make_unique<T> (r.11).

Még akkor is, ha a kód mentes a hívásoktól, malloc és free, továbbra is azt javasoljuk, hogy fontolja meg a jobb lehetőségeket az explicit operátorok new és delete-rel szemben.

C++ alapvető irányelvek:
R.11: Kerülje kifejezetten a new és delete hívását

A végső javítás az intelligens mutatók és a megfelelő gyári függvények, például a std::make_unique használata.

Megjegyzések

  • Az ellenőrző figyelmeztet bármilyen operátor new és delete használatára: skaláris, vektoros, túlterhelt (globális és osztályspecifikus), valamint helyfoglalási verziók esetén. Az elhelyezési new eset bizonyos pontosításokat igényelhet az alapvető irányelvekben a javasolt javítások esetében, és a jövőben kihagyható.

Kódelemzés neve: NO_NEW_DELETE.

Példák

Ez a példa azt mutatja, hogy a C26409 hibajelzés explicit new és delete esetén fordul elő. Fontolja meg intelligens mutatókat létrehozó függvények, mint például a std::make_unique, használatát.

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
}

Van egy C++ kifejezés, amely aktiválja ezt a figyelmeztetést: delete this. A figyelmeztetés szándékos, mert a C++ alapvető irányelvei elriasztják ezt a mintát. A figyelmeztetést az gsl::suppress attribútum használatával letilthatja, ahogyan az ebben a példában látható:

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