Warnung C26815

Der Zeiger ist dangling, da er auf eine temporäre Instanz zeigt, die zerstört wurde. (ES.65)

Hinweise

Der erstellte Zeiger oder die erstellte Ansicht bezieht sich auf ein unbenanntes temporäres Objekt, das am Ende der Anweisung zerstört wird. Der Zeiger oder die Ansicht schuppt.

Diese Überprüfung erkennt Ansichten und Besitzer aus der C++-Standardvorlagenbibliothek (STL). Verwenden Sie die [[msvc::lifetimebound]] Anmerkung, um diese Überprüfung über vom Benutzer erstellte Typen zu vermitteln. Die [[msvc::lifetimebound]] Unterstützung ist neu in MSVC 17.7.

Codeanalysename: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP

Beispiel

Berücksichtigen Sie den folgenden Code, der in einer C++-Version vor C++23 kompiliert wurde:

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Oops, the std::optional value returned by getTempOptVec gets deleted
    // because there is no reference to it.
    for (auto i : *getTempOptVec()) // warning C26815
    {
        // do something interesting
    }
}

void views()
{
    // Oops, the 's' suffix turns the string literal into a temporary std::string.
    std::string_view value("This is a std::string"s); // warning C26815
}

struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
    int& r = Y{}.get(); // warning C26815
}

Diese Warnungen können durch Erweitern der Lebensdauer des temporären Objekts behoben werden.

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Fixed by extending the lifetime of the std::optional value by giving it a name.
    auto temp = getTempOptVec();
    for (auto i : *temp)
    {
        // do something interesting
    }
}

void views()
{
    // Fixed by changing to a constant string literal.
    std::string_view value("This is a string literal");
}

struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
    Y y{};
    int& r = y.get();
}

Siehe auch

C26816
ES.65: Leiten Sie keinen ungültigen Zeiger ab