Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 Bereichs liegt, wird sie bereinigt, 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.
Name der Codeanalyse: 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();
}