Поделиться через


Предупреждение C26815

Указатель ддангируется, так как он указывает на временный экземпляр, который был уничтожен. (ES.65)

Замечания

Созданный указатель или представление ссылается на неназванный временный объект, который уничтожается в конце инструкции. Указатель или представление будет дань.

Эта проверка распознает представления и владельцев из стандартной библиотеки шаблонов C++ (STL). Чтобы научить эту проверку типов, созданных пользователем, используйте заметку [[msvc::lifetimebound]] . Поддержка [[msvc::lifetimebound]] новая в MSVC 17.7.

Имя анализа кода: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP

Пример

Рассмотрим следующий код, скомпилированный в версии C++ до 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
}

Эти предупреждения можно исправить, расширив время существования временного объекта.

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

См. также

C26816
ES.65: не разыменовывайте недопустимый указатель