Warnung C26401

Löschen Sie keinen unformatierten Zeiger, der kein owner<T> Zeiger ist (i.11)

Hinweise

Bei dieser Überprüfung wird Code erkannt, bei dem der Umstieg owner<T> eine gute Option für die erste Phase der Umgestaltung sein kann. Wie C26400 erzwingt es Regeln I.11 und R.3, konzentriert sich jedoch auf den "Release"-Teil der Zeigerlebensdauer. Er warnt bei einem Anruf an den Betreiber delete , wenn sein Ziel kein owner<T> oder implizit angenommener Besitzer ist. Weitere Informationen zu auto Deklarationen finden Sie unter C26400. Diese Überprüfung enthält Ausdrücke, die auf globale Variablen, formale Parameter usw. verweisen.

Warnungen C26400 und C26401 treten immer mit C26409 auf, sind aber für Szenarien besser geeignet, in denen die sofortige Migration zu intelligenten Zeigern nicht möglich ist. In solchen Fällen kann das owner<T> Konzept zuerst angenommen werden, und C26409 kann vorübergehend unterdrückt werden.

Codeanalysename: DONT_DELETE_NON_OWNER

Siehe auch

C++ Core Guidelines I.11

Beispiele

struct myStruct {};

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

Sehen Sie, dass C26401 entfernt wird, wenn der Besitz des Zeigers durch gsl::owner angegeben ist.

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

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

Es gibt einen C++-Idiom, der diese Warnung auslöst: delete this. Die Warnung ist beabsichtigt, da die C++-Kernrichtlinien dieses Muster davon abhalten. Sie können die Warnung mithilfe des gsl::suppress Attributs unterdrücken, wie in diesem Beispiel gezeigt:

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