auto a = new int[0];
Gemäß [basic.compound.3] ist der ina einer der folgenden sein:
- Ein Zeiger auf ein Objekt (vom Typ)
int )
- Ein Zeiger hinter dem Ende eines Objekts
- Null
- Ungültig
Wir können die erste Möglichkeit ausschließen, da keine Objekte vom Typ intkonstruiert wurden. Die dritte Möglichkeit ist ausgeschlossen, da in C ++ ein Nicht-Null-Zeiger zurückgegeben werden muss (siehe [basic.stc.dynamic.allocation.2] ). Wir haben also zwei Möglichkeiten: einen Zeiger hinter dem Ende eines Objekts oder einen ungültigen Zeiger.
Ich würde gerne als aZeiger über das Ende hinaus betrachten, aber ich habe keinen seriösen Hinweis, um dies endgültig festzustellen. (Es gibt jedoch eine starke Implikation in [basic.stc] , wenn Sie sehen, wie Sie deletediesen Zeiger verwenden können.) Daher werde ich in dieser Antwort beide Möglichkeiten erläutern .
Dürfen Sie zwischen der Initialisierung und dem Löschen der Kopie den Zeiger auf lesen a + 1?
Das Verhalten ist undefiniert, wie in [Ausdruck.add.4] vorgegeben , unabhängig davon, welche Möglichkeit von oben gilt.
Wenn aes sich um einen Past-the-End-Zeiger handelt, wird davon ausgegangen, dass er auf das hypothetische Element am Index 0eines Arrays ohne Elemente verweist. Das Hinzufügen der Ganzzahl jzu awird nur definiert, wenn 0≤0+j≤n, wo ndie Größe des Arrays ist. In unserem Fall nist Null, daher wird die Summe a+jnur definiert, wennj ist 0. Insbesondere ist das Hinzufügen 1undefiniert.
Wenn a es ungültig ist, fallen wir sauber in "Andernfalls ist das Verhalten undefiniert." (Es überrascht nicht, dass die definierten Fälle nur gültige Zeigerwerte abdecken.)
Ermöglicht die Sprache dem Compiler außerdem die Einstellung aaufnullptr?
Nein . Aus dem oben erwähnten [basic.stc.dynamic.allocation.2] : „Wenn die Anforderung erfolgreich ist , wird der Wert durch eine austauschbare Zuteilungsfunktion ist ein Nicht-Null - Zeiger - Wert zurückgegeben“ . Es gibt auch eine Fußnote, in der darauf hingewiesen wird, dass C ++ (aber nicht C) einen Nicht-Null-Zeiger als Antwort auf eine Null-Anforderung benötigt.
asicher lesen (Sie können es sicher nicht dereferenzieren).