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 rendelje hozzá a kiosztás vagy függvényhívás
owner<T>eredményét visszatérési értékkel egy nyers mutatóhoz, használjaowner<T>inkább (i.11)
Megjegyzések
Ez az ellenőrzés segít kikényszeríteni az *I.11 szabályt: Soha ne adja át a tulajdonjogot nyers mutatóval (T*), amely az R.3 szabály egy részhalmaza : A nyers mutató (a T*) nem tulajdonos. Pontosabban figyelmeztet minden olyan hívásra operator new, amely nyers mutatótípusú változóba menti az eredményét. Emellett figyelmezteti azokat a függvényeket, amelyek akkor térnek vissza gsl::owner<T> , ha eredményeik nyers mutatókhoz vannak rendelve. Az ötlet az, hogy egyértelműen meg kell adnia a memóriaerőforrások tulajdonjogát. További információkért tekintse meg a C++ alapvető irányelveit.
A figyelmeztetés kijavításának legegyszerűbb módja a deklaráció használata auto , ha az erőforrást azonnal hozzárendeli a változódeklarációhoz. Ha ez a javítás nem lehetséges, javasoljuk, hogy használja a típust gsl::owner<T>. Az auto operátorral new inicializált deklarációk "tulajdonosok", mert feltételezzük, hogy a kiosztás eredménye implicit módon tulajdonosmutató. Ezt a feltételezést átadjuk a auto változónak, és úgy kezeljük, mint owner<T>.
Ha ez az ellenőrzés egy visszaadott owner<T>függvény hívását jelzi, az a kódban található jogos hiba jelzése lehet. Alapvetően arra a helyre mutat, ahol a kód kiszivárog egy explicit tulajdonosi fogalmat (és talán magát az erőforrást).
Ez a szabály jelenleg csak a helyi változókat ellenőrzi. Ha kiosztást rendel egy formális paraméterhez, globális változóhoz, osztálytaghoz stb., az nincs megjelölve. Az ilyen forgatókönyvek megfelelő lefedettségét a jövőbeli munkához tervezik.
Kódelemzés neve: NO_RAW_POINTER_ASSIGNMENT.
1. példa: Egyszerű foglalás
char *buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // C26400
2. példa: Egyszerű foglalás (a gsl::owner<T>)
gsl::owner<char*> buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // OK
3. példa: Egyszerű foglalás (a következővel autojavítva: )
auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK