다음을 통해 공유


경고 C26400

반환 값이 있는 할당 또는 함수 호출 owner<T> 결과를 원시 포인터에 할당하지 말고 대신 사용합니다 owner<T> (i.11).

설명

이 검사 *규칙 I.11을 적용하는 데 도움이 됩니다. R.3 규칙의 하위 집합인 원시 포인터(T*)로 소유권을 이전하지 마세요. 원시 포인터(T*)는 소유되지 않습니다. 특히, 원시 포인터 형식의 변수에 operator new결과를 저장 하는 호출에 경고 합니다. 또한 결과가 원시 포인터에 할당된 경우 반환 gsl::owner<T> 되는 함수 호출에 대해 경고합니다. 이 아이디어는 메모리 리소스의 소유권을 명확하게 명시해야 한다는 것입니다. 자세한 내용은 C++ 핵심 지침을 참조 하세요.

이 경고를 해결하는 가장 쉬운 방법은 리소스가 변수 선언에서 즉시 할당된 경우 선언을 사용하는 auto 것입니다. 이 수정이 불가능한 경우 형식 gsl::owner<T>을 사용하는 것이 좋습니다. 모든 할당의 auto 결과가 암시적으로 소유자 포인터라고 가정하기 때문에 연산 new 자를 사용하여 초기화된 선언은 "소유자"입니다. 이 가정을 변수로 auto 전송하고 다음과 같이 owner<T>처리합니다.

이 검사 반환owner<T>되는 함수에 대한 호출에 플래그를 지정하면 코드에서 합법적인 버그가 표시될 수 있습니다. 기본적으로 코드가 명시적 소유권 개념(및 리소스 자체)을 누출하는 위치를 가리킵니다.

이 규칙은 현재 지역 변수만 검사. 정식 매개 변수, 전역 변수, 클래스 멤버 등에 할당을 할당하면 플래그가 지정되지 않습니다. 이러한 시나리오에 대한 적절한 적용 범위는 향후 작업을 위해 계획되어 있습니다.

코드 분석 이름: NO_RAW_POINTER_ASSIGNMENT

예제 1: 단순 할당

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

예제 2: 단순 할당(수정됨 gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

예제 3: 단순 할당(수정됨 auto)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK