Megosztás:


Figyelmeztetés C26417

A megosztott mutató paramétert hivatkozással adja át a rendszer, és nem állítja vissza vagy rendeli újra. Használja inkább a T* vagy a T> elemet.

C++ alapvető irányelvek: R.35: Vegyünk egy shared_ptr<widget>> paramétert annak kifejezéséhez, hogy egy függvény újra megadhatja a megosztott mutatót

A megosztott mutatók hivatkozással való átadása olyan helyzetekben lehet hasznos, amikor az úgynevezett kód frissíti az intelligens mutató objektum célját, és a hívója elvárja az ilyen frissítések megtekintését. Kérdéses, hogy egy hivatkozás kizárólag a megosztott mutató átadási költségeinek csökkentésére szolgál-e. Ha az úgynevezett kód csak a célobjektumhoz fér hozzá, és soha nem kezeli annak élettartamát, biztonságosabb, ha nyers mutatót vagy hivatkozást ad át az erőforrás-kezelési adatok közzététele helyett.

Megjegyzések

  • Ez az ellenőrzés felismeri a std::shared_pointer-t, valamint a felhasználó által definiált típusokat, amelyek valószínűleg megosztott mutatóként viselkednek. A felhasználó által definiált megosztott mutatók esetében a következő jellemzők várhatók:

  • túlterhelt hivatkozásfeloldó vagy tag-hozzáférési operátorok (amelyek nyilvánosak és nem lettek törölve);

  • másolási konstruktor vagy másolás-hozzárendelési operátor (nyilvános és nem törölt);

  • nyilvános destruktor, amely nincs törölve vagy alapértelmezés szerint törölve. Az üres destruktorok továbbra is felhasználó által definiáltnak számítanak.

  • Az alaphelyzetbe állítás vagy az újbóli hozzárendelés műveletét általánosabb módon értelmezzük:

  • a megosztott mutató nem állandó függvényeinek hívása esetleg alaphelyzetbe állíthatja a mutatót;

  • Bármely olyan függvény hívása, amely elfogadja a nem állandó megosztott mutatóra mutató hivatkozást, visszaállíthatja vagy újra hozzárendelheti a mutatót.

Példák

szükségtelen felületi bonyodalom

bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e))
        e = std::make_shared<event>(e->id());
    // ...
}

szükségtelen felületi bonyodalom – egyszerűsített

bool unregister(const event *e)
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e.get()))
        e = std::make_shared<event>(e->id());
    // ...
}