Sdílet prostřednictvím


Upozornění C26401

Neodstraňovat nezpracovaný ukazatel, který není owner<T> (i.11)

Poznámky

Tato kontrola detekuje kód, na owner<T> kterém může být přechod dobrou volbou pro první fázi refaktoringu. Podobně jako C26400 vynucuje pravidla I.11 a R.3, ale zaměřuje se na část životnosti ukazatele vydané verze. Upozorní na jakékoli volání operátora delete , pokud jeho cílem není owner<T> nebo implicitně předpokládaný vlastník. Další informace o auto deklaracích najdete v tématu C26400. Tato kontrola zahrnuje výrazy, které odkazují na globální proměnné, formální parametry atd.

Upozornění C26400 a C26401 se vždy vyskytují u C26409, ale jsou vhodnější pro scénáře, kdy okamžitá migrace na inteligentní ukazatele není možná. V takových případech owner<T> lze nejprve přijmout koncept a C26409 může být dočasně potlačena.

Název analýzy kódu: DONT_DELETE_NON_OWNER

Viz také

C++ Core Guidelines I.11

Příklady

struct myStruct {};

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

Podívejte se, že C26401 je odebrán, pokud je vlastnictví ukazatele označeno gsl::owner.

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

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

Existuje idiom C++, který aktivuje toto upozornění: delete this. Upozornění je záměrné, protože pokyny jazyka C++ Core tento vzor nedoporučuje. Upozornění můžete potlačit pomocí atributu gsl::suppress , jak je znázorněno v tomto příkladu:

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