Aracılığıyla paylaş


Uyarı C26409

Aramaktan new kaçının ve delete açıkça kullanın std::make_unique<T> (r.11).

Kod ve çağrılarından malloc temiz olsa bile ve işleçlerinin deletenew açıkça kullanılmasından daha iyi seçenekleri göz önünde bulundurmanızı öneririz.free

C++ Temel Yönergeleri:
R.11: Yeni çağrısı yapmaktan kaçının ve açıkça silin

Nihai çözüm, akıllı işaretçileri ve gibi std::make_uniqueuygun fabrika işlevlerini kullanmaktır.

Açıklamalar

  • Denetleyici, herhangi bir işleç new türüne yapılan çağrılarda uyarır: deleteskaler, vektör, aşırı yüklenmiş sürümler (genel ve sınıfa özgü) ve yerleştirme sürümleri. Yerleştirme new olayı, önerilen düzeltmeler için Temel Yönergeler'de bazı netleştirmeler gerektirebilir ve gelecekte atlanabilir.

Kod analizi adı: NO_NEW_DELETE

Örnekler

Bu örnekte, açık new ve deleteiçin C26409'un yükseltilmesi gösterilmektedir. Bunun yerine gibi std::make_unique akıllı işaretçi fabrikası işlevlerini kullanmayı göz önünde bulundurun.

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
}

Şu uyarıyı tetikleyen bir C++ deyimi vardır: delete this. C++ Çekirdek Yönergeleri bu düzeni engellemediğinden uyarı kasıtlı olarak yapılır. Bu örnekte gösterildiği gibi özniteliğini kullanarak uyarıyı gsl::suppress gizleyebilirsiniz:

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};
};