C6278C6278

avertissement C6278 : <variable > est alloué avec un tableau new [], mais supprimé avec une variable scalaire delete.warning C6278: <variable> is allocated with array new [], but deleted with scalar delete. Les destructeurs ne seront pas appelées.Destructors will not be called

Cet avertissement apparaît uniquement dans le code C++ et indique que la fonction d’appel a alloué de façon incohérente la mémoire avec le tableau new [] (opérateur), mais l’a libérée avec la valeur scalaire supprimer opérateur.This warning appears only in C++ code and indicates that the calling function has inconsistently allocated memory with the array new [] operator, but freed it with the scalar delete operator. Il s’agit d’un comportement non défini en fonction de la norme C++ et l’implémentation de Microsoft Visual C++.This is undefined behavior according to the C++ standard and the Microsoft Visual C++ implementation. Il existe au moins trois raisons susceptibles de provoquer des problèmes :There are at least three reasons that this is likely to cause problems:

  • Les constructeurs des objets individuels dans le tableau sont appelés, mais pas les destructeurs.The constructors for the individual objects in the array are invoked, but the destructors are not invoked.

  • Si global ou spécifiques à la classe, new, opérateur et opérateur delete ne sont pas compatibles avec opérateur new [] et opérateur delete [], des résultats inattendus sont susceptibles de se produire.If global, or class-specific, operator new and operator delete are not compatible with operator new[] and operator delete[], unexpected results are likely to occur.

  • Il est toujours une opération très risquée s’appuient sur un comportement non défini.It is always very risky to rely on undefined behavior.

    Les ramifications exactes de ce défaut sont difficiles à prévoir.The exact ramifications of this defect are difficult to predict. Cela peut entraîner des fuites de classes avec des destructeurs qui effectuent la désallocation de mémoire ; comportement incohérent des classes avec des destructeurs qui effectuent une opération importante sémantiquement ; ou altérations de la mémoire et les incidents lorsque les opérateurs ont été substitués.It might result in leaks for classes with destructors that perform memory de-allocation; inconsistent behavior for classes with destructors that perform some semantically significant operation; or memory corruptions and crashes when operators have been overridden. Dans d’autres cas, l’incompatibilité peut être sans importance, en fonction de l’implémentation du compilateur et de ses bibliothèques.In other cases the mismatch might be unimportant, depending on the implementation of the compiler and its libraries. L’outil d’analyse ne peut pas toujours faire la distinction entre ces situations.Analysis tool cannot always distinguish between these situations.

    Si la mémoire est allouée par un tableau new [], il doit être libéré généralement avec le tableau delete [].If memory is allocated with array new [], it should be typically be freed with array delete[].

ExempleExample

L’exemple de code suivant génère cet avertissement :The following sample code generates this warning:

class A
{
  // members
};

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

Pour corriger cet avertissement, utilisez l’exemple de code suivant :To correct this warning, use the following sample code:

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

Si l’objet sous-jacent dans le tableau est un type primitif tel que int, float, enum, ou un pointeur, aucun destructeur à appeler.If the underlying object in the array is a primitive type such as int, float, enum, or pointer, there are no destructors to be called. Dans ces cas, l’avertissement C6283 est signalée à la place.In these cases warning C6283 is reported instead.

L’utilisation de nouveau et delete ont de nombreuses pièges en termes de fuites de mémoire et des exceptions.The use of new and delete have many pitfalls in terms of memory leaks and exceptions. Pour éviter ces types de fuites et totalement de problèmes d’exception, utilisez les mécanismes fournis par la bibliothèque STL (C++ Standard Template Library).To avoid these kinds of leaks and exception problems altogether, use the mechanisms that are provided by the C++ Standard Template Library (STL). Ceux-ci incluent shared_ptr, unique_ptr, et vecteur.These include shared_ptr, unique_ptr, and vector. Pour plus d’informations, consultez pointeurs intelligents et bibliothèque Standard C++.For more information, see Smart Pointers and C++ Standard Library.