Sdílet prostřednictvím


Upozornění C26414

"Přesunutí, kopírování, změna přiřazení nebo resetování místního inteligentního ukazatele."

Pokyny pro C++ Core:
R.5: Preferujte objekty s vymezeným oborem, nevydělujte zbytečně haldu.

Inteligentní ukazatele jsou vhodné pro dynamickou správu prostředků, ale nejsou vždy nezbytné. Může být například jednodušší a efektivnější spravovat místní dynamickou vyrovnávací paměť pomocí standardního kontejneru. Dynamické přidělování nemusí být vůbec nutné pro jednotlivé objekty, například pokud nikdy nedožijí funkci tvůrce. Mohou být nahrazeny místními proměnnými. Inteligentní ukazatele se stanou užitečnými v případě, že scénář vyžaduje změnu vlastnictví. Například při opakovaném přiřazení dynamického prostředku nebo v několika cestách. Jsou také užitečné pro prostředky získané z externího kódu. A když se inteligentní ukazatele použijí k prodloužení životnosti prostředku.

Poznámky

Tato kontrola rozpoznává standardní std::unique_pointer i std::shared_pointer šablony a uživatelem definované typy, které mají být pravděpodobně inteligentními ukazateli. Očekává se, že tyto typy definují následující operace:

  • přetížené dereference nebo operátory přístupu členů, které jsou veřejné a nejsou označeny jako odstraněné;

  • veřejný destruktor, který není odstraněný nebo výchozí. To zahrnuje destruktory explicitně definované jako prázdné.

Typ Microsoft::WRL::ComPtr se chová jako sdílený ukazatel, ale často se používá v konkrétních scénářích, které jsou ovlivněny správou doby života modelu COM. Chcete-li zabránit nadměrnému šumu, je tento typ odfiltrován.

Tato kontrola hledá explicitní místní přidělení přiřazená inteligentním ukazatelům, abyste zjistili, jestli by proměnné s vymezeným oborem mohly fungovat jako alternativu. Jak přímé volání operátoru new, tak speciální funkce std::make_unique jako a std::make_shared, jsou interpretovány jako přímé přidělení.

Název analýzy kódu: RESET_LOCAL_SMART_PTR

Příklad

Dynamická vyrovnávací paměť:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Dynamická vyrovnávací paměť nahrazená kontejnerem:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}