다음을 통해 공유


경고 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: 잘못된 포인터를 역참조하지 마세요.