Freigeben über


C6278

Warnung C6278: <Variable> wird mit dem new []-Arrayoperator zugeordnet, aber mit dem delete-Skalaroperator gelöscht. Destruktoren werden nicht aufgerufen.

Diese Warnung wird nur in C++-Code angezeigt. Sie gibt an, dass die aufrufende Funktion mit dem new []-Arrayoperator Speicher inkonsistent belegt, diesen jedoch mit dem delete-Skalaroperator freigegeben hat. Nach dem C++-Standard und der Microsoft VC++-Implementierung ist dies ein nicht definiertes Verhalten. Es gibt mindestens drei Gründe dafür, dass dies Probleme verursacht:

  • Die Konstruktoren für die einzelnen Objekte im Array werden aufgerufen, die Destruktoren hingegen werden nicht aufgerufen. 

  • Wenn der globale (oder klassenspezifische) Operator new und der globale Operator delete nicht mit dem Operator new[] und dem Operator delete[] kompatibel sind, kann dies zu unerwarteten Ergebnissen führen.

  • Es birgt immer ein großes Risiko, sich auf nicht definiertes Verhalten zu verlassen.

Es ist schwierig, die genauen Auswirkungen dieses Fehlers vorherzusagen. Er kann Verluste bei Klassen mit Destruktoren verursachen, die Aufhebungen von Speicherbelegungen durchführen. Er kann aber auch zu einem inkonsistenten Verhalten bei Klassen mit Destruktoren führen, die für die Semantik wichtige Operation durchführen, oder Speicherschäden und Abstürze verursachen, wenn Operatoren überschrieben wurden. In anderen Fällen kann der Konflikt je nach Implementierung des Compilers und der zugehörigen Bibliotheken auch keine Bedeutung haben. Das Analysetool kann nicht immer zwischen diesen Situationen unterscheiden.

Wenn Speicher mit dem new []-Arrayoperator belegt wird, wird er i. d. R. mit dem delete[]-Arrayoperator freigegeben.

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert:

class A
{
  // members
};

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

So korrigieren Sie die Warnung unter Verwendung des folgenden Beispielcodes

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

Wenn es sich bei dem zugrunde liegenden Objekt im Array um einen primitiven Typ wie int, float, enum oder einen Zeiger handelt, stehen keine Destruktoren zum Aufrufen zur Verfügung. In diesen Fällen wird stattdessen die Warnung C6283 gemeldet.