Поделиться через


Предупреждение C26816

Указатель указывает на память, выделенную в стеке (ES.65)

Замечания

Указатель указывает на переменную, выделенную в стеке. Когда переменная выходит из области, она очищается, что приводит к недопустимости указателя.

Эта проверка распознает представления и владельцев из стандартной библиотеки шаблонов C++ (STL). Чтобы научить эту проверку типов, созданных пользователем, используйте заметку [[msvc::lifetimebound]] . Поддержка [[msvc::lifetimebound]] новая в MSVC 17.7.

Имя анализа кода: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Примеры

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

Исправление заключается в расширении срока действия используемого значения. В этом примере мы устраняем предупреждение, возвращая std::string. Его также можно устранить, копируя данные в кучу или добавляя переменную out в список параметров функции.

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

См. также

C26815
ES.65: не разыменовывайте недопустимый указатель