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.
Ne töröljön olyan belső mutatót, amely nem (
owner<T>i.11)
Megjegyzések
Ez az ellenőrzés olyan kódot észlel, ahol a áthelyezés owner<T> jó lehetőség lehet a refaktorálás első szakaszában. A C26400-hoz hasonlóan az I.11 és R.3 szabályokat is érvényesíti, de a mutató élettartamának "kiadási" részére összpontosít. Figyelmeztet az operátor delete hívására, ha a célpont nem egy owner<T> vagy implicit feltételezett tulajdonos. A nyilatkozatokkal kapcsolatos auto további információkért lásd: C26400. Ez az ellenőrzés olyan kifejezéseket tartalmaz, amelyek globális változókra, formális paraméterekre stb. hivatkoznak.
A C26400 és a C26401 figyelmeztetések mindig előfordulnak a C26409-ben, de megfelelőbbek olyan forgatókönyvekhez, ahol az intelligens mutatókra való azonnali áttelepítés nem kivitelezhető. Ilyen esetekben először a owner<T> koncepciót lehet elfogadni, és a C26409-et ideiglenesen el lehet tiltani.
Kódelemzés neve: DONT_DELETE_NON_OWNER.
Lásd még
Példák
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Nézze meg, hogy a C26401 el legyen távolítva, ha a mutató tulajdonjogát a gsl::owner jelzi.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
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};
};