Condividi tramite


C6279

avviso C6279: <variabile> è stato allocato con l'operatore scalare new, ma eliminato con l'operatore di matrice delete []

Questo avviso viene visualizzato solo nel codice C++ e indica che nella funzione chiamante la memoria è stata allocata in maniera incoerente con l'operatore scalare new, ma è stata liberata con l'operatore di matrice delete []. Se è allocata con l'operatore scalare new, la memoria dovrebbe essere liberata con l'operatore scalare delete.

È probabile che si verifichino problemi per almeno tre ragioni, indicate di seguito.

  • I costruttori relativi ai singoli oggetti della matrice non 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.

È difficile prevedere le ramificazioni esatte di questo errore. Potrebbe causare un comportamento casuale o l'arresto del sistema dovuto all'utilizzo di memoria non inizializzata senza che vengano chiamati i costruttori oppure potrebbe causare allocazioni di memoria e arresti di sistema in situazioni in cui è stato eseguito l'override degli operatori. In casi rari la mancanza di corrispondenza potrebbe non essere importante. Attualmente lo strumento di analisi non distingue tra queste situazioni.

Esempio

Il codice seguente genera questo avviso:

class A
{
  // members
};

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

Per risolvere il problema, utilizzare il codice seguente:

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