Warnung C26407

Bevorzugen Sie bereichsbezogene Objekte, nicht unnötig zuordnen (r.5)

Um unnötige Verwendung von Zeigern zu vermeiden, versuchen wir, allgemeine Muster lokaler Zuordnungen zu erkennen. Beispielsweise erkennen wir, wann das Ergebnis eines Aufrufs des Operators new in einer lokalen Variablen gespeichert und später explizit gelöscht wird. Diese Überprüfung unterstützt die C++-Kernrichtlinienregel R.5: Bevorzugen Sie bereichsbezogene Objekte, nicht unnötig zuordnen. Um das Problem zu beheben, verwenden Sie einen RAII-Typ anstelle eines unformatierten Zeigers, und ermöglichen Sie es, ressourcen zu behandeln. Offensichtlich ist es nicht erforderlich, einen Wrappertyp zu erstellen, um ein einzelnes Objekt zuzuweisen. Stattdessen würde eine lokale Variable des Typs des Objekts besser funktionieren.

Hinweise

  • Um die Anzahl der Warnungen zu reduzieren, erkennt die Codeanalyse nur dieses Muster für Besitzerzeiger. Daher ist es notwendig, besitzer zuerst richtig zu kennzeichnen. Wir können diese Analyse ganz einfach erweitern, um unformatierte Zeiger abzudecken, wenn wir Feedback zu den Visual Studio C++-Entwicklercommunity von Kunden erhalten, die solche Szenarien unterstützen.

  • Der Bereichsobjektausdruck kann etwas irreführend sein. Im Allgemeinen empfehlen wir, entweder eine lokale Variable zu verwenden, deren Lebensdauer automatisch verwaltet wird, oder ein intelligentes Objekt, das dynamische Ressourcen effizient verwaltet. Smart objects can do heap allocations, but it's not explicit in the code.

  • Wenn die Warnung bei der Arrayzuordnung ausgelöst wird, die häufig für dynamische Puffer benötigt wird, können Sie sie mithilfe von Standardcontainern oder std::unique_pointer<T[]>.

  • Das Muster wird nur für lokale Variablen erkannt. In Fällen, in denen eine Zuordnung zugewiesen ist, z. B. einer globalen Variablen, wird nicht gewarnt und dann in derselben Funktion gelöscht.

Codeanalysename: DONT_HEAP_ALLOCATE_UNNECESSARILY

Beispiel 1: Unnötige Objektzuweisung für Heap

auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer;  // C26407

Beispiel 2: Unnötige Objektzuordnung für Heap (mit lokalem Objekt behoben)

Tracer tracer;  // OK
ScanObjects(&tracer);

Beispiel 3: Unnötige Pufferzuweisung für Heap

auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
    CheckValue(value);
delete[] value; // C26407

Beispiel 4: Unnötige Pufferzuweisung für den Heap (mit Container behoben)

auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
    CheckValue(value.data());