Udostępnij za pośrednictwem


Ostrzeżenie C26401

Nie usuwaj nieprzetworzonego wskaźnika, który nie jest wskaźnikiem owner<T> (i.11)

Uwagi

Ta kontrola wykrywa kod, w którym przejście do owner<T> może być dobrym rozwiązaniem dla pierwszego etapu refaktoryzacji. Podobnie jak C26400, wymusza reguły I.11 i R.3, ale koncentruje się na części "release" okresu istnienia wskaźnika. Ostrzega przy każdym wywołaniu operatora delete , jeśli jego element docelowy nie jest właścicielem owner<T> lub niejawnie zakładanym właścicielem. Aby uzyskać więcej informacji na temat auto deklaracji, zobacz C26400. Ta kontrola obejmuje wyrażenia odwołujące się do zmiennych globalnych, parametrów formalnych itd.

Ostrzeżenia C26400 i C26401 zawsze występują z C26409, ale są bardziej odpowiednie w scenariuszach, w których natychmiastowa migracja do inteligentnych wskaźników nie jest możliwa. W takich przypadkach owner<T> można najpierw przyjąć koncepcję, a C26409 może zostać tymczasowo pominięta.

Nazwa analizy kodu: DONT_DELETE_NON_OWNER

Zobacz też

Podstawowe wytyczne dotyczące języka C++ I.11

Przykłady

struct myStruct {};

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

Zobacz, że C26401 jest usuwany, jeśli własność wskaźnika jest wskazywana przez gsl::owner.

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

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

Istnieje idiom języka C++, który wyzwala to ostrzeżenie: delete this. Ostrzeżenie jest zamierzone, ponieważ wytyczne podstawowe języka C++ odradzają ten wzorzec. Ostrzeżenie można pominąć przy użyciu atrybutu gsl::suppress , jak pokazano w tym przykładzie:

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