경고 C26409

호출 new 하지 말고 delete 명시적으로 대신 사용합니다 std::make_unique<T> (r.11).

코드가 호출 malloc 에 클린 경우에도 연산 deletenew 자를 free명시적으로 사용하는 것보다 더 나은 옵션을 고려하는 것이 좋습니다.

C++ 핵심 지침:
R.11: 새로 호출하지 말고 명시적으로 삭제

궁극적인 해결 방법은 스마트 포인터 및 적절한 팩터리 함수(예: std::make_unique.)를 사용하는 것입니다.

설명

  • 검사er는 모든 종류의 연산 new 자 또는 delete스칼라, 벡터, 오버로드된 버전(전역 및 클래스별) 및 배치 버전에 대한 호출에 대해 경고합니다. 배치 new 사례는 제안된 수정에 대한 핵심 지침의 몇 가지 설명이 필요할 수 있으며 나중에 생략될 수 있습니다.

코드 분석 이름: NO_NEW_DELETE

예제

이 예제에서는 C26409가 명시적 newdelete에 대해 발생했음을 보여줍니다. 대신 스마트 포인터 팩터리 함수를 std::make_unique 사용하는 것이 좋습니다.

void f(int i)
{
    int* arr = new int[i]{}; // C26409, warning is issued for all new calls
    delete[] arr;            // C26409, warning is issued for all delete calls

    auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}

이 경고를 delete this트리거하는 C++ 관용구가 있습니다. C++ 핵심 지침에서 이 패턴을 권장하지 않으므로 경고는 의도적인 것입니다. 이 예제와 같이 특성을 사용하여 gsl::suppress 경고를 표시하지 않을 수 있습니다.

class MyReferenceCountingObject final
{
public:
    void AddRef();
    void Release() noexcept
    {
        ref_count_--;
        if (ref_count_ == 0)
        {
            [[gsl::suppress(i.11)]]
            delete this; 
        }
    }
private:
    unsigned int ref_count_{1};
};