Uyarı C26409
Aramaktan
new
kaçının vedelete
açıkça kullanınstd::make_unique<T>
(r.11).
Kod ve çağrılarından malloc
temiz olsa bile ve işleçlerinin delete
new
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_unique
uygun fabrika işlevlerini kullanmaktır.
Açıklamalar
- Denetleyici, herhangi bir işleç
new
türüne yapılan çağrılarda uyarır:delete
skaler, vektör, aşırı yüklenmiş sürümler (genel ve sınıfa özgü) ve yerleştirme sürümleri. Yerleştirmenew
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 delete
iç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};
};