Dela via


Varning C26816

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

Se även

C26815
ES.65: Avreferera inte en ogiltig pekare