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
etoperator delete
ne sont pas compatibles avecoperator new[]
etoperator 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
, , float
ou enum
pointeur, 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 new
delete
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_ptr
et des conteneurs tels que vector
. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour