Freigeben über


Warnung C6278

'Variable' wird array new [], aber mit skalarer Löschung gelöscht. Destruktoren werden nicht aufgerufen.

Hinweise

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. Diese Verwendung ist nicht definiertes Verhalten gemäß dem C++-Standard und der Microsoft C++-Implementierung.

Es gibt mindestens drei Gründe, aus denen dieses Missverhältnis zu Problemen führen kann:

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

  • Wenn global oder klassenspezifisch operator new und operator delete nicht kompatibel mit operator new[] und operator delete[]sind unerwartete Ergebnisse wahrscheinlich auftreten.

  • Es ist immer riskant, sich auf nicht definiertes Verhalten zu verlassen.

Es ist schwierig, die genauen Auswirkungen dieses Fehlers vorherzusagen. Dies kann zu Lecks für Klassen mit Destruktoren führen, die die Speicherdeteilung durchführen. Es kann zu inkonsistenten Verhalten für Klassen mit Destruktoren führen, die semantisch signifikante Vorgänge ausführen, oder Speicherbeschädigungen und Abstürze, wenn Operatoren außer Kraft gesetzt wurden. In anderen Fällen kann der Konflikt je nach Implementierung des Compilers und der zugehörigen Bibliotheken auch keine Bedeutung haben. Analysetools können nicht immer zwischen diesen Situationen unterscheiden.

Wenn Speicher mit Array new []zugewiesen wird, sollte er mit Array delete[]freigegeben werden.

Codeanalysename: ARRAY_NEW_DELETE_MISMATCH

Beispiel

Im folgenden Beispielcode wird die Warnung C6278 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 das zugrunde liegende Objekt im Array ein Grundtyp ist, z int. B. , float, , enumoder Zeiger, gibt es keine Destruktoren, die aufgerufen werden sollen. In diesen Fällen wird stattdessen die Warnung C6283 gemeldet.

Die Verwendung von new und delete hat viele Fallstricke in Bezug auf Speicherlecks und Ausnahmen. Um diese Arten potenzieller Lecks vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr, , unique_ptrund Container wie vector. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.