Condividi tramite


Avviso C26409

Evitare di chiamare new e delete usare in modo esplicito std::make_unique<T> (r.11).

Anche se il codice è pulito dalle chiamate a e , è comunque consigliabile prendere in considerazione opzioni migliori rispetto all'uso malloc esplicito di operatori new e delete.free

Linee guida di base per C++:
R.11: Evitare di chiamare nuovi ed eliminare in modo esplicito

La correzione finale consiste nell'usare puntatori intelligenti e funzioni di factory appropriate, ad esempio std::make_unique.

Osservazioni:

  • Il controllo avvisa le chiamate a qualsiasi tipo di operatore new o delete: scalare, vettore, versioni di overload (specifiche della classe e globale) e versioni di posizionamento. Il caso di posizionamento new potrebbe richiedere alcuni chiarimenti nelle linee guida di base per le correzioni suggerite e potrebbe essere omesso in futuro.

Nome dell'analisi del codice: NO_NEW_DELETE

Esempi

Questo esempio mostra che C26409 viene generato per esplicito new e delete. Prendere in considerazione l'uso di funzioni factory del puntatore intelligente, std::make_unique ad esempio .

void f(int i)
{
    int* arr = new int[i]{}; // C26409, warning is issued for all new calls
    delete[] arr;            // C26409, warning is issued for all delete calls

    auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}

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