Ostrzeżenie C26815

Wskaźnik zwisa, ponieważ wskazuje na tymczasowe wystąpienie, które zostało zniszczone. (ES.65)

Uwagi

Utworzony wskaźnik lub widok odwołuje się do nienazwanego obiektu tymczasowego, który jest niszczony na końcu instrukcji. Wskaźnik lub widok będzie zwijać.

To sprawdzenie rozpoznaje widoki i właścicieli z standardowej biblioteki szablonów języka C++ (STL). Aby nauczyć się tego sprawdzania typów utworzonych przez użytkownika, użyj adnotacji [[msvc::lifetimebound]] . Obsługa [[msvc::lifetimebound]] jest nowa w programie MSVC 17.7.

Nazwa analizy kodu: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP

Przykład

Przed C++23 rozważmy następujący kod skompilowany w wersji 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
}

Te ostrzeżenia można naprawić przez wydłużenie okresu istnienia obiektu tymczasowego.

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

Zobacz też

C26816
ES.65: Nie wyłuszaj nieprawidłowego wskaźnika