경고 C26414

"로컬 스마트 포인터 이동, 복사, 재할당 또는 다시 설정"

C++ 핵심 지침:
R.5: 범위가 지정된 개체를 선호하고 불필요하게 힙 할당하지 마세요.

스마트 포인터는 동적 리소스 관리에 편리하지만 항상 필요한 것은 아닙니다. 예를 들어 표준 컨테이너를 사용하여 로컬 동적 버퍼를 관리하는 것이 더 쉽고 효율적일 수 있습니다. 예를 들어 작성자 함수보다 오래 살지 않는 경우 단일 개체에 대해 동적 할당이 전혀 필요하지 않을 수 있습니다. 지역 변수로 바꿀 수 있습니다. 시나리오에서 소유권을 변경해야 하는 경우 스마트 포인터가 편리해집니다. 예를 들어 동적 리소스를 여러 번 또는 여러 경로에 다시 할당하는 경우입니다. 외부 코드에서 가져온 리소스에도 유용합니다. 또한 스마트 포인터를 사용하여 리소스의 수명을 연장합니다.

설명

이 검사 표준 std::unique_pointer 및 템플릿과 std::shared_pointer 스마트 포인터로 의도된 사용자 정의 형식을 모두 인식합니다. 이러한 형식은 다음 작업을 정의해야 합니다.

  • 퍼블릭이고 삭제된 것으로 표시되지 않은 오버로드된 역참조 또는 멤버 액세스 연산자

  • 삭제되거나 기본값이 아닌 공용 소멸자입니다. 여기에는 명시적으로 비어 있는 것으로 정의된 소멸자가 포함됩니다.

형식 Microsoft::WRL::ComPtr 은 공유 포인터로 동작하지만 COM 수명 관리의 영향을 받는 특정 시나리오에서 자주 사용됩니다. 과도한 노이즈를 방지하기 위해 이 형식은 필터링됩니다.

이 검사 스마트 포인터에 할당된 명시적 로컬 할당을 찾아 범위가 지정된 변수가 대안으로 작동할 수 있는지 확인합니다. 연산 new자에 대한 직접 호출과 같은 std::make_unique 특수 함수는 std::make_shared모두 직접 할당으로 해석됩니다.

코드 분석 이름: RESET_LOCAL_SMART_PTR

예시

동적 버퍼:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

컨테이너로 대체된 동적 버퍼:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}