Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Указатель ддангируется, так как он указывает на временный экземпляр, который был уничтожен. (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();
}