C ++ Array löscht die Operatorsyntax

7

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?

    
raven 17.11.2009, 10:40
quelle

7 Antworten

13

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.

    
Naveen 17.11.2009, 10:53
quelle
10

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.

    
Mike Seymour 17.11.2009 10:51
quelle
5

delete[] array; ist die korrekte Form.

    
laura 17.11.2009 10:44
quelle
5

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.

    
Mykola Golubyev 17.11.2009 10:44
quelle
4

Der richtige Weg ist delete[] array; . Ich wusste nicht einmal delete[N] array; würde kompilieren (und ich bezweifle es sollte).

    
sbi 17.11.2009 10:44
quelle
4

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!

    
Jerry Coffin 17.11.2009 15:01
quelle
-2

Wenn es funktioniert, ist es eine nicht standardmäßige Erweiterung.

%Vor%

ist die korrekte Form.

%Vor%

funktioniert manchmal auch, ist aber implementierungsabhängig (also falsch).

    
Nicholaz 17.11.2009 11:50
quelle

Tags und Links