Partager via


C6278

avertissement C6278 : <variable> est alloué avec un tableau new [], mais supprimé avec une variable scalaire delete. Aucun destructeur ne sera appelé

Cet avertissement apparaît uniquement dans le code C++ et indique que la fonction d'appel a alloué de façon incohérente de la mémoire avec l'opérateur de tableau new [], mais l'a libérée avec l'opérateur scalaire delete. Ce comportement n'est pas défini selon la norme C++ et l'implémentation Microsoft VC++. Il existe au moins trois raisons susceptibles de créer des problèmes :

  • Les constructeurs de chaque objet contenu dans le tableau sont appelés, mais pas les destructeurs. 

  • Si operator new et operator delete globaux ou spécifiques à la classe ne sont pas compatibles avec operator new[] et operator delete[], des résultats inattendus risquent de se produire.

  • Il est toujours très risqué de dépendre d'un comportement non défini.

Les ramifications exactes de ce défaut sont difficiles à prévoir. Cela peut entraîner des fuites de classes avec des destructeurs qui exécutent une annulation de l'allocation de mémoire, un comportement incohérent des classes avec des destructeurs qui exécutent des opérations sémantiquement significatives ou des altérations de la mémoire et des blocages lors de la substitution des opérateurs. Dans d'autres cas, l'incompatibilité peut être insignifiante, selon l'implémentation du compilateur et de ses bibliothèques. L'outil d'analyse ne peut pas toujours faire la distinction entre ces situations.

Si la mémoire est allouée avec le tableau new [], il doit être libéré généralement avec le tableau delete[].

Exemple

L'exemple de code suivant génère cet avertissement :

class A
{
  // members
};

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

Pour corriger cet avertissement, utilisez l'exemple de code suivant :

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

Si l'objet sous-jacent dans le tableau est un type primitif, par exemple int, float, enum, ou un pointeur, aucun destructeur n'est appelé. Dans ces cas, l'avertissement C6283 s'affiche à la place.