경고 C26415

스마트 포인터 매개 변수는 포함된 포인터에 액세스하는 데만 사용됩니다. 대신 T* 또는 T>를 사용합니다.

C++ 핵심 지침: R.30: 스마트 포인터를 매개 변수로 사용하여 수명 의미 체계를 명시적으로 표현

스마트 포인터 형식을 사용하여 데이터를 함수에 전달하는 것은 대상 함수가 포함된 개체의 수명을 관리해야 했음을 나타냅니다. 그러나 함수는 스마트 포인터만 사용하여 포함된 개체에 액세스하고 실제로 할당 취소로 이어질 수 있는 코드를 호출하지 않는다고 가정합니다(즉, 수명에 영향을 주지 않음). 그런 다음 일반적으로 스마트 포인터로 인터페이스를 복잡하게 할 필요가 없습니다. 포함된 개체에 대한 일반 포인터 또는 참조를 사용하는 것이 좋습니다.

설명

이 검사 C26410, C26415, C26417 및 C26418을 유발하는 대부분의 시나리오를 다룹니다. 먼저 SMART_PTR_NOT_NEEDED 클린 공유 또는 고유 포인터에 대한 에지 케이스로 전환하는 것이 좋습니다. 더 집중적인 클린 위해 이 경고를 사용하지 않도록 설정할 수 있습니다.

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

  • 퍼블릭이고 삭제된 것으로 표시되지 않은 오버로드된 역참조 또는 멤버 액세스 연산자입니다.
  • 명시적으로 비어 있는 소멸자를 포함하여 삭제되거나 기본값이 아닌 공용 소멸자입니다.

포함된 개체의 수명에 영향을 줄 수 있는 작업의 해석은 광범위하며 다음을 포함합니다.

  • 비 상수 스마트 포인터에 대한 포인터 또는 참조 매개 변수를 허용하는 모든 함수
  • 생성자 또는 할당 연산자 복사 또는 이동
  • 비 상수 함수

예제

번거로운 수명 관리.

bool set_initial_message(
            const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
    if (!m || initial_message_)
        return false;

    initial_message_.reset(m.get());
    return true;
}

void pass_message(const message_info &info)
{
    auto m = std::make_unique<message>(info);
    const auto release = set_initial_message(m);
    // ...
    if (release)
        m.release();
}

번거로운 수명 관리 - 재작업.

void set_initial_message(std::shared_ptr<message> m) noexcept
{
    if (m && !initial_message_)
        initial_message_ = std::move(m);
}

void pass_message(const message_info &info)
{
    auto m = std::make_shared<message>(info);
    set_initial_message(m);
    // ...
}