경고 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());
// ...
}