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());