Megosztás:


Figyelmeztetés C26401

Ne töröljön olyan belső mutatót, amely nem ( owner<T> i.11)

Megjegyzések

Ez az ellenőrzés olyan kódot észlel, ahol a áthelyezés owner<T> jó lehetőség lehet a refaktorálás első szakaszában. A C26400-hoz hasonlóan az I.11 és R.3 szabályokat is érvényesíti, de a mutató élettartamának "kiadási" részére összpontosít. Figyelmeztet az operátor delete hívására, ha a célpont nem egy owner<T> vagy implicit feltételezett tulajdonos. A nyilatkozatokkal kapcsolatos auto további információkért lásd: C26400. Ez az ellenőrzés olyan kifejezéseket tartalmaz, amelyek globális változókra, formális paraméterekre stb. hivatkoznak.

A C26400 és a C26401 figyelmeztetések mindig előfordulnak a C26409-ben, de megfelelőbbek olyan forgatókönyvekhez, ahol az intelligens mutatókra való azonnali áttelepítés nem kivitelezhető. Ilyen esetekben először a owner<T> koncepciót lehet elfogadni, és a C26409-et ideiglenesen el lehet tiltani.

Kódelemzés neve: DONT_DELETE_NON_OWNER.

Lásd még

C++ alapvető irányelvek I.11

Példák

struct myStruct {};

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

Nézze meg, hogy a C26401 el legyen távolítva, ha a mutató tulajdonjogát a gsl::owner jelzi.

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

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

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