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 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());
// ...
}