Megosztás:


Figyelmeztetés C26407

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());