경고 C26417
공유 포인터 매개 변수는 참조로 전달되며 다시 설정하거나 다시 할당하지 않습니다. 대신 T* 또는 T>를 사용합니다.
C++ 핵심 지침: R.35: shared_ptr<위젯>& 매개 변수를 사용하여 함수가 공유 포인터를 다시 연결할 수 있음을 표현합니다.
참조로 공유 포인터를 전달하는 것은 호출된 코드가 스마트 포인터 개체의 대상을 업데이트하고 호출자가 이러한 업데이트를 볼 것으로 예상하는 시나리오에서 유용할 수 있습니다. 공유 포인터 전달 비용을 줄이기 위해 참조만 사용하는 것은 의심의 여지가 있습니다. 호출된 코드는 대상 개체에만 액세스하고 수명을 관리하지 않는 경우 리소스 관리 세부 정보를 노출하는 대신 원시 포인터 또는 참조를 전달하는 것이 더 안전합니다.
설명
이 검사는 공유 포인터처럼 동작할 가능성이 있는 사용자 정의 형식과 인식
std::shared_pointer
합니다. 사용자 정의 공유 포인터에는 다음과 같은 특성이 필요합니다.오버로드된 역참조 또는 멤버 액세스 연산자(public 및 non-deleted);
복사 생성자 또는 복사 할당 연산자(public 및 non-deleted);
삭제되거나 기본값이 아닌 공용 소멸자입니다. 빈 소멸자는 여전히 사용자 정의로 계산됩니다.
다시 설정 또는 재할당 작업은 보다 일반적인 방식으로 해석됩니다.
공유 포인터에서 비 상수 함수를 호출하면 포인터가 다시 설정될 수 있습니다.
비 상수 공유 포인터에 대한 참조를 허용하는 함수에 대한 모든 호출은 해당 포인터를 다시 설정하거나 다시 할당할 수 있습니다.
예제
불필요한 인터페이스 복잡성
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
불필요한 인터페이스 복잡성 - 간소화
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}