Upozornění C26417
Parametr sdíleného ukazatele se předá odkazem a neobnoví se ani znovu nepřiřazuje. Místo toho použijte T* nebo T&.
C++ Core Guidelines: R.35: Převzetí shared_ptr<widgetu> a parametru, který vyjadřuje, že funkce může znovu nasdílený ukazatel
Předání sdílených ukazatelů odkazem může být užitečné ve scénářích, kdy volal kód aktualizuje cíl objektu inteligentního ukazatele a jeho volající očekává, že tyto aktualizace uvidí. Použití odkazu pouze ke snížení nákladů na předání sdíleného ukazatele je otázkou. Pokud se nazývá kód pouze přistupuje k cílovému objektu a nikdy nespravuje jeho životnost, je bezpečnější předat nezpracovaný ukazatel nebo odkaz, a ne vystavit podrobnosti o správě prostředků.
Poznámky
Tato kontrola rozpozná a
std::shared_pointer
uživatelem definované typy, které se pravděpodobně budou chovat jako sdílené ukazatele. U uživatelem definovaných sdílených ukazatelů se očekávají následující vlastnosti:přetížené dereference nebo operátory přístupu členů (veřejné a neodstranené);
konstruktoru kopírování nebo operátor přiřazení kopírování (veřejný a neodstraněný);
veřejný destruktor, který není odstraněný nebo výchozí. Prázdné destruktory se stále počítají jako uživatelem definované.
Akce resetování nebo opětovného přiřazení se interpretuje obecněji:
jakékoli volání nekontinuální funkce na sdíleném ukazateli může potenciálně resetovat ukazatel;
jakékoli volání funkce, která přijímá odkaz na nekontinuální sdílený ukazatel, může potenciálně resetovat nebo znovu přiřadit tento ukazatel.
Příklady
zbytečná komplikace rozhraní
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());
// ...
}
zbytečná komplikace rozhraní – zjednodušená
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());
// ...
}