Dela via


Varning C26414

"Flytta, kopiera, omtilldela eller återställa en lokal smart pekare."

C++ Core-riktlinjer:
R.5: Föredra avgränsade objekt, undvik att heap-allokera i onödan

Smarta pekare är praktiska för dynamisk resurshantering, men de är inte alltid nödvändiga. Det kan till exempel vara enklare och effektivare att hantera en lokal dynamisk buffert med hjälp av en standardcontainer. Du kanske inte behöver dynamisk allokering alls för enskilda objekt, till exempel om de aldrig överlever sin skaparfunktion. De kan ersättas med lokala variabler. Smarta pekare blir praktiska när ett scenario kräver ägarbyte. När du till exempel omtilldelar en dynamisk resurs flera gånger eller i flera sökvägar. De är också användbara för resurser som hämtas från extern kod. Och när smarta pekare används för att förlänga livslängden för en resurs.

Anmärkningar

Den här kontrollen identifierar både standard std::unique_pointer - och std::shared_pointer mallar och användardefinierade typer som sannolikt är avsedda att vara smarta pekare. Sådana typer förväntas definiera följande åtgärder:

  • Överlagrade avrefererings- eller medlemsaccessoperatorer som är publika och inte markerade som borttagna.

  • en offentlig destruktor som inte är borttagen eller förvald. De inkluderar destruktorer som uttryckligen definierade som tomma.

Typen Microsoft::WRL::ComPtr fungerar som en delad pekare, men den används ofta i specifika scenarier som påverkas av COM-livslängdshanteringen. För att undvika överdrivet brus filtreras den här typen bort.

Den här kontrollen söker efter explicita lokala allokeringar som tilldelats smarta pekare för att identifiera om begränsade variabler kan fungera som ett alternativ. Både direktanrop till operatorn new, och specialfunktioner som std::make_unique och std::make_shared, tolkas som direkta allokeringar.

Kodanalysnamn: RESET_LOCAL_SMART_PTR

Exempel

Dynamisk buffert

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

Dynamisk buffert som ersätts av containern:

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