Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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();
}