C6279

Mise à jour : novembre 2007

C6279

avertissement C6279 : <variable> est alloué avec une variable scalaire new, mais supprimé avec un tableau delete []

Cet avertissement apparaît uniquement dans le code C++ et indique que l'appel de la fonction a alloué de façon incohérente la mémoire avec l'opérateur scalaire new, puis l'a libérée avec l'opérateur de tableau delete []. Si la mémoire est allouée avec l'opérateur scalaire new, elle doit en principe être libérée avec l'opérateur scalaire delete.

Cela risque de provoquer des problèmes pour au moins trois raisons :

  • Les constructeurs des objets individuels du tableau ne sont pas appelés, alors que les destructeurs le sont.

  • Si les opérateurs new et delete globaux (ou spécifiques à la classe) ne sont pas compatibles avec new[] et delete[], il est probable que des résultats inattendus se produiront.

Les ramifications exactes de cette erreur sont difficiles à prévoir. Elle peut provoquer un comportement ou des incidents aléatoire en raison de l'utilisation d'une mémoire non initialisée parce que les constructeurs ne sont pas appelés. Elle peut aussi provoquer des allocations de mémoire et des incidents dans les situations où les opérateurs ont été substitués. Dans certains cas rares, l'incompatibilité peut ne pas poser de problème. La version actuelle de l'outil d'analyse ne fait pas la distinction entre les différentes situations.

Exemple

Le code suivant génère cet avertissement :

class A
{
  // members
};

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

Pour corriger cet avertissement, utilisez le code suivant :

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