Sdílet prostřednictvím


Upozornění C26816

Ukazatel odkazuje na paměť přidělenou v zásobníku (ES.65)

Poznámky

Ukazatel odkazuje na proměnnou, která je přidělena v zásobníku. Když proměnná přejde mimo rozsah, vyčistí se, což způsobí, že ukazatel bude neplatný.

Tato kontrola rozpozná zobrazení a vlastníky ze standardní knihovny šablon C++ (STL). Pokud chcete tuto kontrolu naučit o uživatelově vytvořených typech, použijte poznámku [[msvc::lifetimebound]] . Podpora [[msvc::lifetimebound]] je v MSVC 17.7 nová.

Název analýzy kódu: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Příklady

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

Oprava je prodloužit životnost použité hodnoty. V tomto příkladu se budeme zabývat upozorněním vrácením řetězce std::string. Můžete ji také vyřešit zkopírováním dat do haldy nebo přidáním proměnné out do seznamu parametrů funkce.

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

Viz také

C26815
ES.65: Nepřesouvejte odkaz na neplatný ukazatel