다음을 통해 공유


경고 C26815

삭제된 임시 인스턴스를 가리키므로 포인터가 매달려 있습니다. (ES.65)

설명

만든 포인터 또는 뷰는 문 끝에 제거되는 명명되지 않은 임시 개체를 나타냅니다. 포인터 또는 뷰가 매달려 있습니다.

이 검사 C++ STL(표준 템플릿 라이브러리)에서 뷰 및 소유자를 인식합니다. 이 검사 사용자가 작성한 형식에 대해 가르치려면 주석을 [[msvc::lifetimebound]] 사용합니다. 지원은 [[msvc::lifetimebound]] MSVC 17.7의 새로운 기능입니다.

코드 분석 이름: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP

예시

C++23 이전의 C++ 버전에서 컴파일된 다음 코드를 고려합니다.

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Oops, the std::optional value returned by getTempOptVec gets deleted
    // because there is no reference to it.
    for (auto i : *getTempOptVec()) // warning C26815
    {
        // do something interesting
    }
}

void views()
{
    // Oops, the 's' suffix turns the string literal into a temporary std::string.
    std::string_view value("This is a std::string"s); // warning C26815
}

struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
    int& r = Y{}.get(); // warning C26815
}

이러한 경고는 임시 개체의 수명을 연장하여 해결할 수 있습니다.

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Fixed by extending the lifetime of the std::optional value by giving it a name.
    auto temp = getTempOptVec();
    for (auto i : *temp)
    {
        // do something interesting
    }
}

void views()
{
    // Fixed by changing to a constant string literal.
    std::string_view value("This is a string literal");
}

struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
    Y y{};
    int& r = y.get();
}

참고 항목

C26816
ES.65: 잘못된 포인터를 역참조하지 마세요.