Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"Helyi intelligens mutató áthelyezése, másolása, újbóli hozzárendelése vagy alaphelyzetbe állítása."
C++ alapvető irányelvek:
R.5: Részesítse előnyben a hatókörhöz kötött objektumokat, és ne végezzen szükségtelenül halom allokálást
Az intelligens mutatók kényelmesek a dinamikus erőforrás-kezeléshez, de nem mindig szükségesek. Egyszerűbb és hatékonyabb lehet például egy helyi dinamikus puffer kezelése standard tároló használatával. Előfordulhat, hogy egyetlen objektumhoz egyáltalán nincs szükség dinamikus lefoglalásra, például ha soha nem használják ki a létrehozói függvényüket. Ezek helyi változókkal helyettesíthetők. Az intelligens mutatók akkor lesznek hasznosak, ha egy forgatókönyv tulajdonosváltást igényel. Ha például egy dinamikus erőforrást többször vagy több útvonalon rendel hozzá újra. Külső kódból beszerzett erőforrásokhoz is hasznosak. És amikor intelligens mutatókat használnak az erőforrás élettartamának meghosszabbításához.
Megjegyzések
Ez az ellenőrzés felismeri mind a standard std::unique_pointer és std::shared_pointer sablonokat, mind a felhasználó által definiált típusokat, amelyek valószínűleg intelligens mutatók. Az ilyen típusok várhatóan a következő műveleteket határozzák meg:
túlterhelt hivatkozási vagy taghozzáférési operátorok, amelyek nyilvánosak és nincsenek töröltként megjelölve;
nyilvános destruktor, amely nincs törölve vagy alapértelmezés szerint törölve. Ide tartoznak a kifejezetten üresként definiált destruktorok.
A típus Microsoft::WRL::ComPtr megosztott mutatóként viselkedik, de gyakran használják olyan helyzetekben, amelyeket a COM élettartam-kezelése érint. A túlzott zaj elkerülése érdekében ez a típus szűrve van.
Ez az ellenőrzés az intelligens mutatókhoz rendelt explicit helyi foglalásokat keresi annak megállapításához, hogy a hatókörrel rendelkező változók működhetnek-e alternatívaként. Az operátor new közvetlen hívásai és az olyan speciális függvények, mint a std::make_unique és std::make_shared, közvetlen foglalásokként értelmezendők.
Kódelemzés neve: RESET_LOCAL_SMART_PTR.
példa
Dinamikus puffer:
void unpack_and_send(const frame &f)
{
auto buffer = std::make_unique<char[]>(f.size()); // C26414
f.unpack(buffer.get());
// ...
}
Tárolóra cserélt dinamikus puffer:
void unpack_and_send(const frame &f)
{
auto buffer = std::vector<char>(f.size());
f.unpack(buffer.data());
// ...
}