Warnung C26816

Der Zeiger verweist auf den Speicher, der auf dem Stapel zugeordnet ist (ES.65)

Hinweise

Der Zeiger verweist auf eine Variable, die auf dem Stapel zugeordnet ist. Wenn die Variable außerhalb des Gültigkeitsbereichs liegt, wird sie sauber, was dazu führt, dass der Zeiger ungültig ist.

Diese Überprüfung erkennt Ansichten und Besitzer aus der C++-Standardvorlagenbibliothek (STL). Verwenden Sie die [[msvc::lifetimebound]] Anmerkung, um diese Überprüfung über vom Benutzer erstellte Typen zu vermitteln. Die [[msvc::lifetimebound]] Unterstützung ist neu in MSVC 17.7.

Codeanalysename: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Beispiele

// 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
}

Der Fix besteht darin, die Lebensdauer des verwendeten Werts zu verlängern. In diesem Beispiel wird die Warnung durch Zurückgeben der std::string adressiert. Es kann auch behoben werden, indem die Daten in den Heap kopiert oder der Funktionsparameterliste eine "out"-Variable hinzugefügt wird.

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

Siehe auch

C26815
ES.65: Leiten Sie keinen ungültigen Zeiger ab