Condividi tramite


Avviso C26401

Non eliminare un puntatore owner<T> non elaborato diverso da (ad esempio 11)

Osservazioni:

Questo controllo rileva il codice in cui lo spostamento in owner<T> può essere un'opzione valida per la prima fase del refactoring. Come C26400, applica le regole I.11 e R.3, ma si concentra sulla parte "release" della durata del puntatore. Avvisa su qualsiasi chiamata a un operatore delete se la destinazione non è o owner<T> un proprietario assunto in modo implicito. Per altre informazioni sulle auto dichiarazioni, vedere C26400. Questo controllo include espressioni che fanno riferimento a variabili globali, parametri formali e così via.

Gli avvisi C26400 e C26401 si verificano sempre con C26409, ma sono più appropriati per gli scenari in cui la migrazione immediata ai puntatori intelligenti non è fattibile. In questi casi, il owner<T> concetto può essere adottato per primo e C26409 può essere temporaneamente eliminato.

Nome dell'analisi del codice: DONT_DELETE_NON_OWNER

Vedi anche

Linee guida di base di C++I.11

Esempi

struct myStruct {};

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

Vedere che C26401 viene rimosso se la proprietà del puntatore è indicata da gsl::owner.

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

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

Esiste un linguaggio C++ che attiva questo avviso: delete this. L'avviso è intenzionale, perché le linee guida di base di C++ sconsigliano questo modello. È possibile eliminare l'avviso usando l'attributo gsl::suppress , come illustrato in questo esempio:

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