Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Kerülje el
newésdeletekifejezetten hívását, helyette használja astd::make_unique<T>(r.11).
Még akkor is, ha a kód mentes a hívásoktól, malloc és free, továbbra is azt javasoljuk, hogy fontolja meg a jobb lehetőségeket az explicit operátorok new és delete-rel szemben.
C++ alapvető irányelvek:
R.11: Kerülje kifejezetten a new és delete hívását
A végső javítás az intelligens mutatók és a megfelelő gyári függvények, például a std::make_unique használata.
Megjegyzések
- Az ellenőrző figyelmeztet bármilyen operátor
newésdeletehasználatára: skaláris, vektoros, túlterhelt (globális és osztályspecifikus), valamint helyfoglalási verziók esetén. Az elhelyezésineweset bizonyos pontosításokat igényelhet az alapvető irányelvekben a javasolt javítások esetében, és a jövőben kihagyható.
Kódelemzés neve: NO_NEW_DELETE.
Példák
Ez a példa azt mutatja, hogy a C26409 hibajelzés explicit new és delete esetén fordul elő. Fontolja meg intelligens mutatókat létrehozó függvények, mint például a std::make_unique, használatát.
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
}
Van egy C++ kifejezés, amely aktiválja ezt a figyelmeztetést: delete this. A figyelmeztetés szándékos, mert a C++ alapvető irányelvei elriasztják ezt a mintát. A figyelmeztetést az gsl::suppress attribútum használatával letilthatja, ahogyan az ebben a példában látható:
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};
};