Condividi tramite


C6278

Aggiornamento: novembre 2007

C6278

avviso C6278: <variabile> è stato allocato con l'operatore di matrice new [], ma eliminato con l'operatore scalare delete. I distruttori non verranno chiamati

Questo avviso viene visualizzato solo nel codice C++ e indica che nella funzione chiamante la memoria è stata allocata in maniera incoerente con l'operatore di matrice new, ma è stata liberata con l'operatore scalare delete []. Si tratta di un comportamento indefinito in base allo standard C++ e all'implementazione Microsoft VC++. È probabile che si verifichino problemi per almeno tre ragioni, indicate di seguito.

  • I costruttori relativi ai singoli oggetti della matrice vengono richiamati, a differenza dei distruttori.

  • Se l'operatore new e l'operatore delete globali o specifici di una classe non sono compatibili con gli operatori new[] e delete[], è possibile che si verifichino risultati non previsti.

  • È sempre molto rischioso affidarsi a un comportamento indefinito.

È difficile prevedere le ramificazioni esatte di questo errore. Potrebbe provocare perdite nel caso di classi con distruttori che eseguono la deallocazione della memoria, comportamento incoerente per classi con distruttori che eseguono alcune operazioni semanticamente significative oppure arresti anomali del sistema o danneggiamenti della memoria quando è stato eseguito l'override degli operatori. In altri casi la mancata corrispondenza potrebbe essere irrilevante, a seconda dell'implementazione del compilatore e delle relative librerie. Lo strumento di analisi non è sempre in grado di distinguere tra queste situazioni.

Se è stata allocata con l'operatore di matrice new [], la memoria dovrebbe essere liberata con l'operatore di matrice delete[].

Esempio

Il codice di esempio seguente genera questo avviso:

class A
{
  // members
};

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

Per risolvere il problema, utilizzare il codice di esempio seguente:

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

Se l'oggetto sottostante della matrice è un tipo primitivo quale int, float, enum o puntatore, non sono disponibili distruttori da chiamare. In tali casi viene invece visualizzato l'avviso C6283.