Avertissement C6278

'variable' est alloué avec le tableau nouveau [], mais supprimé avec la suppression scalaire. Les destructeurs ne seront pas appelés.

Notes

Cet avertissement apparaît uniquement dans le code C++ et indique que la fonction appelante a alloué de manière 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 . Cette utilisation n’est pas définie en fonction de la norme C++ et de l’implémentation de Microsoft C++.

Il existe au moins trois raisons pour lesquelles cette incompatibilité est susceptible d’entraîner des problèmes :

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

  • Si global, ou spécifique à une classe, operator new et operator delete ne sont pas compatibles avec operator new[] et operator delete[], les résultats inattendus sont susceptibles de se produire.

  • Il est toujours risqué de s’appuyer sur un comportement non défini.

Les ramifications exactes de ce défaut sont difficiles à prédire. Cela peut entraîner des fuites pour les classes avec des destructeurs qui effectuent une désaffectation de mémoire. Cela peut entraîner un comportement incohérent pour les classes avec des destructeurs qui effectuent une opération sémantiquement significative, ou des altérations de mémoire et des incidents lorsque les opérateurs ont été remplacés. Dans d’autres cas, l’incompatibilité peut ne pas être importante, en fonction de l’implémentation du compilateur et de ses bibliothèques. Les outils d’analyse ne peuvent pas toujours faire la distinction entre ces situations.

Si la mémoire est allouée à un tableau new [], elle doit être libérée avec le tableau delete[].

Nom de l’analyse du code : ARRAY_NEW_DELETE_MISMATCH

Exemple

L’exemple de code suivant génère l’avertissement C6278 :

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 du tableau est un type primitif tel que int, , floatou enumpointeur, il n’existe aucun destructeur à appeler. Dans ces cas, l’avertissement C6283 est signalé à la place.

L’utilisation et présente de nombreux pièges en termes de newdelete fuites de mémoire et d’exceptions. Pour éviter ces types de fuites potentielles, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.