Megosztás:


Figyelmeztetés C26816

A mutató a veremen lefoglalt memóriára mutat (ES.65)

Megjegyzések

A mutató a veremen lefoglalt változóra mutat. Amikor a változó kimegy a hatókörből, az törlődik, ami miatt a mutató érvénytelen lesz.

Ez az ellenőrzés felismeri a C++ Standard Sablontár (STL) nézeteit és tulajdonosait. Ha meg szeretné tanítani ezt az ellenőrzést a felhasználó által létrehozott típusokról, használja a [[msvc::lifetimebound]] jegyzetet. A [[msvc::lifetimebound]] támogatás az MSVC 17.7-ben új.

Kódelemzés neve: LIFETIME_LOCAL_USE_AFTER_FREE_STACK.

Példák

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

A javítás a használt érték élettartamának meghosszabbítása. Ebben a példában az std::sztring visszaadásával foglalkozunk a figyelmeztetéssel. Az is megoldható, ha az adatokat a halomba másolja, vagy hozzáad egy "out" változót a függvényparaméterek listájához.

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

Lásd még

C26815
ES.65: Ne hivatkozzon érvénytelen mutatóra