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.
A hatókörrel rendelkező objektumok előnyben részesítése, ne foglalja le feleslegesen (r.5)
A mutatók szükségtelen használatának elkerülése érdekében megpróbáljuk észlelni a helyi foglalások gyakori mintáit. Észleljük például, hogy egy operátor new hívásának eredménye egy helyi változóban van tárolva, majd később explicit módon törlődik. Ez az ellenőrzés támogatja a C++ alapvető irányelvek R.5 szabályát: A hatókörrel rendelkező objektumok előnyben részesítése, a felesleges lefoglalások mellőzése. A probléma megoldásához használjon RAII-típust nyers mutató helyett, és engedélyezze az erőforrások kezelését. Nyilvánvaló, hogy nem szükséges burkolótípust létrehozni egyetlen objektum lefoglalásához. Ehelyett az objektum típusának helyi változója jobban működne.
Megjegyzések
A figyelmeztetések számának csökkentése érdekében a kódelemzés csak a tulajdonosmutatók esetében észleli ezt a mintát. Ezért először helyesen kell megjelölni a tulajdonosokat. Ezt az elemzést egyszerűen kiterjeszthetjük nyers mutatókra, ha visszajelzést kapunk a Visual Studio C++ fejlesztői közösségéről az ilyen forgatókönyveket támogató ügyfelektől.
A hatókörrel rendelkező objektum kifejezés kissé félrevezető lehet. Általában azt javasoljuk, hogy használjon olyan helyi változót, amelynek élettartama automatikusan felügyelt, vagy egy intelligens objektumot, amely hatékonyan kezeli a dinamikus erőforrásokat. Az intelligens objektumok halomfoglalásokat végezhetnek, de a kód nem explicit.
Ha a figyelmeztetés a dinamikus pufferekhez gyakran szükséges tömbfoglalást aktiválja, azt standard tárolókkal vagy
std::unique_pointer<T[]>.A minta csak helyi változók esetén észlelhető. Nem figyelmeztetjük azokat az eseteket, amikor egy foglalás például egy globális változóhoz van hozzárendelve, majd ugyanabban a függvényben törlődik.
Kódelemzés neve: DONT_HEAP_ALLOCATE_UNNECESSARILY.
1. példa: Felesleges objektumfoglalás a halomon
auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer; // C26407
2. példa: Felesleges objektumfoglalás a halomra (helyi objektummal javítva)
Tracer tracer; // OK
ScanObjects(&tracer);
3. példa: Felesleges pufferfoglalás a halomon
auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
CheckValue(value);
delete[] value; // C26407
4. példa: Szükségtelen pufferfoglalás a halomon (tárolóval javítva)
auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
CheckValue(value.data());