Condividi tramite


Avviso C6278

'variable' viene allocato con array new [], ma eliminato con l'eliminazione scalare. I distruttori non verranno chiamati.

Osservazioni:

Questo avviso viene visualizzato solo nel codice C++ e indica che la funzione chiamante ha allocato in modo incoerente la memoria con l'operatore array new [] , ma lo ha liberato con l'operatore scalare delete . Questo utilizzo non è definito in base allo standard C++ e all'implementazione di Microsoft C++.

Esistono almeno tre motivi per cui è probabile che questa mancata corrispondenza causi problemi:

  • I costruttori per i singoli oggetti nella matrice vengono richiamati, ma i distruttori non vengono richiamati.

  • Se globale o specifico operator new della classe e operator delete non sono compatibili con operator new[] e operator delete[], è probabile che si verifichino risultati imprevisti.

  • È sempre rischioso basarsi sul comportamento non definito.

Le esatte ramificazioni di questo difetto sono difficili da prevedere. Potrebbero verificarsi perdite di classi con distruttori che eseguono la de-allocazione della memoria. Potrebbe causare un comportamento incoerente per le classi con distruttori che eseguono un'operazione semanticamente significativa o danneggiamenti della memoria e arresti anomali quando gli operatori sono stati sottoposti a override. In altri casi la mancata corrispondenza potrebbe non essere importante, a seconda dell'implementazione del compilatore e delle relative librerie. Gli strumenti di analisi non possono sempre distinguere tra queste situazioni.

Se la memoria viene allocata con la matrice new [], deve essere liberata con la matrice delete[].

Nome dell'analisi del codice: ARRAY_NEW_DELETE_MISMATCH

Esempio

Il codice di esempio seguente genera l'avviso C6278:

class A
{
  // members
};

void f( )
{
  A *pA = new A[5];
  // code ...
  delete pA;
}

Per correggere questo avviso, usare il codice di esempio seguente:

void f( )
{
  A *pA = new A[5];
  // code ...
  delete[] pA;
}

Se l'oggetto sottostante nella matrice è un tipo primitivo, ad intesempio , float, enumo puntatore, non sono presenti distruttori da chiamare. In questi casi, viene invece segnalato l'avviso C6283 .

L'uso di new e delete presenta molte insidie in termini di perdite di memoria ed eccezioni. Per evitare completamente questi tipi di potenziali perdite, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptri contenitori , e , unique_ptrad esempio vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.