Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Pekaren är riktad mot minne som har allokerats på stacken (ES.65)
Anmärkningar
Pekaren pekar på en variabel som allokeras i stacken. När variabeln hamnar utanför omfånget rensas den, vilket gör att pekaren blir ogiltig.
Den här kontrollen identifierar vyer och ägare från STL (C++ Standard Template Library). För att lära denna kontroll om användarskapade typer, använd annoteringen [[msvc::lifetimebound]].
Stödet [[msvc::lifetimebound]] är nytt i MSVC 17.7.
Kodanalysnamn: LIFETIME_LOCAL_USE_AFTER_FREE_STACK
Exempel
// In this example, std::string is being used internally because the implementer felt it was easier to
// perform the non-trivial initialization of the value but the function returns a C-style string.
const char *danglingRawPtrFromLocal() {
std::string s;
// interesting string initialization here
return s.c_str(); // Oops, The pointer points to memory that will be cleaned up upon return. Warning C26816.
}
struct Y { int& get() [[msvc::lifetimebound]]; };
int& f() {
Y y;
return y.get(); // Warning C26826
}
Korrigeringen är att förlänga livslängden för det värde som används. I det här exemplet tar vi itu med varningen genom att returnera std::string. Det kan också lösas genom att kopiera data till heap eller att lägga till en "out"-variabel i listan över funktionsparametrar.
std::string danglingRawPtrFromLocal() {
std::string s;
// interesting string initialization here
return s;
}
struct Y { int& get() [[msvc::lifetimebound]]; };
int f() {
Y y;
return y.get();
}