Sdílet prostřednictvím


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