Partager via


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.

Il existe au moins trois raisons susceptibles de créer des problèmes :

  • 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 ce défaut 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;
}

Pour éviter ce genre de problème d'allocation, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard C++.

Voir aussi

Référence

C6014