경고 C26401

(i.11)이 아닌 원시 포인터를 owner<T> 삭제하지 마세요.

설명

이 검사 이동 owner<T> 이 리팩터링의 첫 번째 단계에 적합한 옵션이 될 수 있는 코드를 검색합니다. C26400과 마찬가지로 규칙 I.11 및 R.3을 적용하지만 포인터 수명의 "릴리스" 부분에 중점을 둡니다. 대상이 암시적으로 가정된 소유자가 아닌 경우 연산 deleteowner<T> 호출에 대해 경고합니다. 선언에 대한 auto 자세한 내용은 C26400을 참조 하세요. 이 검사 전역 변수, 공식 매개 변수 등을 참조하는 식이 포함됩니다.

경고 C26400 및 C26401은 항상 C26409에서 발생하지만 스마트 포인터로 즉시 마이그레이션할 수 없는 시나리오에 더 적합합니다. 이러한 경우 owner<T> 개념을 먼저 채택할 수 있으며 C26409는 일시적으로 억제될 수 있습니다.

코드 분석 이름: DONT_DELETE_NON_OWNER

참고 항목

C++ 핵심 지침 I.11

예제

struct myStruct {};

myStruct* createMyStruct();
void function()
{
    myStruct* pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}

포인터의 소유권이 gsl::owner로 표시되는 경우 C26401이 제거되었는지 확인합니다.

#include <gsl/pointers>
struct myStruct {};

gsl::owner<myStruct*> createMyStruct();
void function()
{
    gsl::owner<myStruct*> pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // no warning.
}

이 경고를 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};
};