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 int
konstruiert 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 a
Zeiger ü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 delete
diesen 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 a
es sich um einen Past-the-End-Zeiger handelt, wird davon ausgegangen, dass er auf das hypothetische Element am Index 0
eines Arrays ohne Elemente verweist. Das Hinzufügen der Ganzzahl j
zu a
wird nur definiert, wenn 0≤0+j≤n
, wo n
die Größe des Arrays ist. In unserem Fall n
ist Null, daher wird die Summe a+j
nur definiert, wennj
ist 0
. Insbesondere ist das Hinzufügen 1
undefiniert.
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 a
aufnullptr
?
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.
a
sicher lesen (Sie können es sicher nicht dereferenzieren).