2015-11-17 3 views
7

ich den Norm-Entwurf N3337 und Fußnote 79 (§ 5.3.7 Seite 110) Staaten (Hervorhebung von mir) Lesen:Was ist das Null-Längen-Array, das im Normentwurf erwähnt wird?

79) Für Nicht-Null-Länge-Arrays, das ist das gleiche wie ein Zeiger auf das erste Element des Arrays, das von diesem neuen Ausdruck erstellt wurde. Null-Länge Arrays nicht über ein erstes Element

Ich hatte den Eindruck, dass C++ nicht die Länge Null-Arrays hat unterstützen.

+1

Sie können nicht viel mit ihnen tun. Es ist im Grunde zu erlauben, dass new in Bezug auf malloc implementiert wird, soweit ich weiß. –

Antwort

4

Soweit ich verstehe, ist dies zu ermöglichen, dass neue in Bezug auf malloc implementiert werden, die Anfragen von null Größe erlaubt. Sie können nicht viel mit ihnen tun, da die Dereferenzierung eines solchen Pointers, wie im unten stehenden Zitat erwähnt, ein undefiniertes Verhalten ist.

Wir können eine Begründung im Entwurf der C++ Standard Fußnote 35 finden, die aus dem Abschnitt verwiesen wird 3.7.4.1[basic.stc.dynamic.allocation]:

[...] Auch wenn die Größe Der angeforderte Speicherplatz ist Null, die Anfrage kann fehlschlagen. Wenn die Anforderung erfolgreich ist, muss der zurückgegebene Wert ein Nicht-Null-Zeigerwert (4.10) p0 sein, der sich von dem zuvor zurückgegebenen Wert p1 unterscheidet, es sei denn, dieser Wert p1 wurde anschließend an einen Operator delete übergeben. Der Effekt der Dereferenzierung eines als Anforderung für die Größe 0 zurückgegebenen Zeigers ist nicht definiert.

und Fußnote 35 sagt:

Die Absicht Operator new() implementierbar durch den Aufruf von std :: malloc zu haben ist() oder std :: calloc(), so sind die Regeln im Wesentlichen das gleiche. C++ unterscheidet sich von C darin, dass eine Nullanforderung erforderlich ist, um einen Nicht-Null-Zeiger zurückzugeben. Abschnitt Standard 7.22.3 Speichermanagementfunktionen

Vom C11 Entwurf:

[...] Wenn die Größe der angeforderte Speicherplatz Null ist, ist das Verhalten implementierungsdefiniert: Entweder wird ein Nullzeiger zurückgegeben, oder das Verhalten ist so, als wäre die Größe ein Wert ungleich Null, außer dass der zurückgegebene Zeiger nicht verwendet werden soll um auf ein Objekt zuzugreifen.

6

Während die Länge Null-Arrays wie

int arr[0]; 

sind nicht Standard C++, dynamische Arrays der Länge Null wie

int *arr = new int[0]; 

legal sind und was Ihr Angebot bezieht sich auch:

Wenn der Wert des Ausdrucks in einem noptr-new-declarator Null ist, wird die Zuweisungsfunktion zuaufgerufenweisen ein Array ohne Elemente zu.

5.3.4 (7) in N3337.