Freigeben über


Warnung C26409

Vermeiden Sie anrufe new und delete explizit, verwenden std::make_unique<T> Sie stattdessen (r.11).

Auch wenn Code von Aufrufen malloc sauber ist und freewir dennoch empfehlen, bessere Optionen als die explizite Verwendung von Operatoren new und delete.

C++-Kernrichtlinien:
R.11: Vermeiden sie explizites Aufrufen neuer und löschen

Der ultimative Fix ist die Verwendung intelligenter Zeiger und geeigneter Werksfunktionen, z std::make_unique. B. .

Hinweise

  • Die Prüfer warnt bei Aufrufen jeder Art von Operator new oder delete: Skalar, Vektor, überladene Versionen (global und klassenspezifisch) und Platzierungsversionen. Der Platzierungsfall new erfordert möglicherweise einige Klarstellungen in den Kernrichtlinien für vorgeschlagene Fixes und kann in Zukunft weggelassen werden.

Codeanalysename: NO_NEW_DELETE

Beispiele

Dieses Beispiel zeigt, dass C26409 für explizit und explizit newdeleteausgelöst wird. Erwägen Sie stattdessen die Verwendung intelligenter Zeigerfabrikfunktionen, z std::make_unique . B.

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
}

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