C6278
Aktualisiert: November 2007
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 zugewiesen, 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) new-Operator und der globale delete-Operator nicht mit dem new[]-Operator und dem delete[]-Operator 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 Speicherzuordnungen 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 zugewiesen 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.