Sagen Sie
, nachdem ich es getan habe Foo* array = new Foo[N];
Ich habe es immer so gelöscht
delete[] array;
Aber manchmal habe ich es so gesehen:
delete[N] array;
Wie es scheint zu kompilieren und zu arbeiten (zumindest in msvc2005), frage ich mich: Was ist der richtige Weg? Warum kompiliert es dann den anderen Weg?
Sie können diesen MSDN-Link überprüfen: löschen Sie den [N] -Operator . Der Wert wird ignoriert.
BEARBEITEN Ich habe diesen Beispielcode auf VC9 versucht:
%Vor%Ausgabe ist: Test !!
Der Ausdruck wird also ausgewertet, aber der Rückgabewert wird ignoriert. Ich bin überrascht, gelinde gesagt, ich kann mir kein Szenario vorstellen, warum dies erforderlich ist.
delete [N] array
ist ungültig. Es ist nicht im C ++ - Standard definiert: Abschnitt 5.3.5 definiert einen Lösch-Ausdruck entweder als delete expr
oder delete [] expr
und nichts anderes. Es kompiliert nicht auf gcc (Version 4.1.2). Warum es in Visual C ++ kompiliert: fragen Sie Microsoft.
Ob der zweite Fall richtig ist oder nicht, ich würde empfehlen, den ersten als fehleranfällig zu verwenden.
Visual Studio kompiliert viele Dinge, die es nicht tun sollte.
Erster Punkt: Es gibt fast nie einen guten Grund, das Array-Formular von new oder delete zu verwenden - verwenden Sie stattdessen std :: vector (oder einen anderen Container).
Zweitens: Zurück in den dunklen Zeiten von C ++, mussten Sie die Größe des Arrays angeben, das Sie löschten. Wenn Sie also x = new T[N]
verwendet haben, war das übereinstimmende Löschen delete [N] x
. Die Anforderung, die Größe explizit anzugeben, wurde long entfernt, aber einige Compiler (insbesondere diejenigen, die auf Abwärtskompatibilität mit altem Code achten) erlauben dies immer noch.
Wenn Sie nicht wirklich mit einem alten Compiler (etwa 20 Jahre alt) kompatibel bleiben müssen, sollten Sie ihn nicht verwenden. Wenn Sie nicht mit einem Compiler kompatibel bleiben müssen, der so alt ist, dass er keine Standardcontainer unterstützt, sollten Sie das Matrixformular von new oder delete nicht verwenden. Hör einfach auf!
Tags und Links arrays c++ delete-operator