16

In C++, wenn Sie ein Array dynamisch zuzuweisen, können Sie etwas tun:Warum benötigt der Compiler `delete [] p` gegenüber` delete p [] `?

int *p; 
p = new int[i]; // i is some number 

, aber das Array zu löschen, was Sie tun ...

delete[] p; 

Warum isn‘ t es delete p[]? Wäre das nicht symmetrischer mit dem, wie es ursprünglich erschaffen wurde? Was ist der Grund (wenn überhaupt), warum die Sprache so entworfen wurde?

+8

Warum der Downvote/Vote zu schließen? Was kann ich tun, um die Frage zu verbessern? – Michael0x2a

+5

@Deflect: Das war meins, Normalerweise "Warum wurde dieses Sprachkonstrukt gewählt?" Fragen sind einfach nicht konstruktiv, weil es keine objektive, vernünftige Antwort gibt. Aber in diesem Fall gibt es ein paar gute Gründe, also habe ich vielleicht zu früh geurteilt (ich habe meinen Downvote ziemlich schnell entfernt). – KillianDS

+1

@KillianDS: Okay, das macht Sinn. Danke für Ihre Antwort! [und mich beruhigen, dass ich nicht völlig verrückt bin :)] – Michael0x2a

Antwort

29

Ein Grund könnte sein, diese Fälle deutlicher zu machen.

int ** p; 
delete[] p 
delete p[1]; 

Wenn es delete p[] war dann ein ein Zeichen Fehler würde ziemlich bösen consquences hat.

+13

Dies ist besonders richtig, da Sie in frühen C++ die Anzahl der Elemente in der '[]' angeben mussten. –

+4

@JamesKanze: Klingt so, als ob das die Antwort auf mich wäre. 'delete p [4]' wäre mehrdeutig. – GManNickG

+0

@GManNickG Genau. –

2

Da das Array beim Übergeben als Parameter an die Funktion (oder den Operator) in den Zeiger zerfällt. Also lösche p [] wäre einfach äquivalent zum Löschen von p.

[bearbeiten] Wir können von löschen als spezielle Vorlage Betreiber denken. Der Operator sollte in der Lage sein, zwischen p und p [] zu unterscheiden, um die richtige "Spezialisierung" auszuwählen (Nicht-Array- oder Array-Löschung). Template-Argument-Ableitungsregeln machen diese Auswahl jedoch unmöglich (aufgrund des Zerfalls des Arrays können wir nicht zwischen p [] und p unterscheiden, wenn wir das Argument ableiten).

So können wir nicht mit Namen verwenden Operator löschen für beiden casees und benötigen eine anderer Betreiber einzuführen löscht [] mit diffrent Namen (Suffix [] kann als Teil des Bedienernamen behandelt werden) für die Array-Fall.

[Bearbeiten 2] Hinweis. löschen p [] ist nach dem aktuellen Standard überhaupt nicht sintax. Die obige Argumentation zeigt nur Probleme, die auftreten könnten, wenn wir versuchen würden, delete p [] unter Verwendung existierender C++ - Konzepte zu interpretieren.

+0

Nein, es ist nicht gleichwertig. Die Verwendung eines anderen ist ein undefiniertes Verhalten. – sharptooth

+0

@scharfe Zahn:? Übergeben eines Arrays in Templates statt Zeiger ist UB? Ich denke über delete als über einen templated Operator und dieser Operator kann nicht die richtige Spezialisierung auswählen, weil er nicht zwischen p [] und p unterscheiden kann, wenn er das Argument herleitet.Deshalb müssen wir einen speziellen Operator delete [] für Arrays einführen, anstatt den gleichen Operatornamen zu verwenden. – user396672

+0

Ein Zeiger, der von 'new' an' delete [] 'zurückgegeben wird, ist UB – sharptooth