Condividi tramite


Avviso C26407

Preferisce gli oggetti con ambito, non allocare inutilmente (r.5)

Per evitare l'uso non necessario di puntatori, si tenta di rilevare modelli comuni di allocazioni locali. Ad esempio, viene rilevato quando il risultato di una chiamata all'operatore new viene archiviato in una variabile locale e successivamente eliminato in modo esplicito. Questo controllo supporta la regola delle linee guida di base di C++R.5: preferire gli oggetti con ambito, non allocare inutilmente heap. Per risolvere il problema, usare un tipo RAII anziché un puntatore non elaborato e consentire la gestione delle risorse. Ovviamente, non è necessario creare un tipo wrapper per allocare un singolo oggetto. Al contrario, una variabile locale del tipo dell'oggetto funziona meglio.

Osservazioni:

  • Per ridurre il numero di avvisi, l'analisi del codice rileva solo questo modello per i puntatori proprietari. Quindi, è necessario contrassegnare correttamente i proprietari. È possibile estendere facilmente questa analisi per coprire i puntatori non elaborati se si ricevono commenti e suggerimenti sulla community degli sviluppatori di Visual Studio C++ dai clienti a supporto di tali scenari.

  • Il termine dell'oggetto con ambito può essere un po' fuorviante. In generale, è consigliabile usare una variabile locale la cui durata viene gestita automaticamente o un oggetto intelligente che gestisce in modo efficiente le risorse dinamiche. Gli oggetti intelligenti possono eseguire allocazioni di heap, ma non è esplicito nel codice.

  • Se l'avviso viene generato sull'allocazione di matrici, che è spesso necessario per i buffer dinamici, è possibile correggerlo usando contenitori standard o std::unique_pointer<T[]>.

  • Il modello viene rilevato solo per le variabili locali. Non viene visualizzato un avviso nei casi in cui viene assegnata un'allocazione, ad esempio una variabile globale e quindi eliminata nella stessa funzione.

Nome dell'analisi del codice: DONT_HEAP_ALLOCATE_UNNECESSARILY

Esempio 1: Allocazione di oggetti non necessaria nell'heap

auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer;  // C26407

Esempio 2: Allocazione di oggetti non necessaria nell'heap (fissa con oggetto locale)

Tracer tracer;  // OK
ScanObjects(&tracer);

Esempio 3: Allocazione di buffer non necessaria nell'heap

auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
    CheckValue(value);
delete[] value; // C26407

Esempio 4: allocazione di buffer non necessaria nell'heap (fissa con contenitore)

auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
    CheckValue(value.data());