Sdílet prostřednictvím


Upozornění C26815

Ukazatel se proklápí, protože ukazuje na dočasnou instanci, která byla zničena. (ES.65)

Poznámky

Vytvořený ukazatel nebo zobrazení odkazuje na nepojmenovaný dočasný objekt, který je zničen na konci příkazu. Ukazatel nebo zobrazení se změní.

Tato kontrola rozpozná zobrazení a vlastníky ze standardní knihovny šablon C++ (STL). Pokud chcete tuto kontrolu naučit o uživatelově vytvořených typech, použijte poznámku [[msvc::lifetimebound]] . Podpora [[msvc::lifetimebound]] je v MSVC 17.7 nová.

Název analýzy kódu: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP

Příklad

Zvažte následující kód zkompilovaný ve verzi C++ před C++23:

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
}

Tato upozornění lze opravit prodloužením životnosti dočasného objektu.

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

Viz také

C26816
ES.65: Nepřesouvejte odkaz na neplatný ukazatel