Warnung C26414

"Verschieben, Kopieren, Neuzuweisen oder Zurücksetzen eines lokalen intelligenten Zeigers."

C++-Kernrichtlinien:
R.5: Bevorzugen Sie bereichsbezogene Objekte, weisen Sie nicht unnötig heap zu.

Intelligente Zeiger sind praktisch für die dynamische Ressourcenverwaltung, aber sie sind nicht immer erforderlich. Beispielsweise kann es einfacher und effizienter sein, einen lokalen dynamischen Puffer mithilfe eines Standardcontainers zu verwalten. Möglicherweise benötigen Sie keine dynamische Zuordnung für einzelne Objekte, wenn sie beispielsweise nie ihre Erstellerfunktion überlebt haben. Sie können durch lokale Variablen ersetzt werden. Intelligente Zeiger werden praktisch, wenn ein Szenario eine Änderung des Eigentums erfordert. Wenn Sie beispielsweise eine dynamische Ressource mehrmals oder in mehreren Pfaden neu zuweisen. Sie sind auch nützlich für Ressourcen, die aus externem Code abgerufen werden. Und wenn intelligente Zeiger verwendet werden, um die Lebensdauer einer Ressource zu erweitern.

Hinweise

Diese Überprüfung erkennt sowohl die Standard std::unique_pointer - als std::shared_pointer auch die Vorlagen sowie benutzerdefinierte Typen, die wahrscheinlich intelligente Zeiger sein sollen. Solche Typen werden erwartet, dass die folgenden Vorgänge definiert werden:

  • überladene Ableitungs- oder Memberzugriffsoperatoren, die öffentlich sind und nicht als gelöscht gekennzeichnet sind;

  • ein öffentlicher Destruktor, der nicht gelöscht oder standardmäßig festgelegt ist. Dazu gehören destruktoren, die explizit als leer definiert sind.

Der Typ Microsoft::WRL::ComPtr verhält sich als gemeinsamer Zeiger, wird jedoch häufig in bestimmten Szenarien verwendet, die von der COM-Lebensdauerverwaltung betroffen sind. Um übermäßiges Rauschen zu vermeiden, wird dieser Typ herausgefiltert.

Bei dieser Überprüfung wird nach expliziten lokalen Zuordnungen gesucht, die intelligenten Zeigern zugewiesen sind, um festzustellen, ob bereichsbezogene Variablen als Alternative funktionieren könnten. Sowohl direkte Aufrufe an den Operator newals auch spezielle Funktionen std::make_unique wie und std::make_shared, werden als direkte Zuordnungen interpretiert.

Codeanalysename: RESET_LOCAL_SMART_PTR

Beispiel

Dynamischer Puffer:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Dynamischer Puffer ersetzt durch Container:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}