new[]
-
Sone schrieb:
new bool[0];Ja, das funktioniert und ist definiert:
5.3.4/5 schrieb:
When the value of the expression in a noptr-new-declarator is zero, the allocation function is called to allocate an array with no elements.
Entsprechend funktioniert dann auch das Zerstoeren.
okay, perfekt, vielen dank.
Marthog schrieb:
Was willst du damit bezwecken? Ein pointer, der auf 0 Elemente zeigt, kann genausogut auf nichts zeigen (nullptr).
ja, ich selbst schreibe ja in meinem code natürlich nicht, dass ich 0 elemente mit new[] erzeugen will, eher wird die anzahl der elemente durch eine berechnung bestimmt, welche unter umständen auch 0 ergeben kann.
Marthog schrieb:
Außerdem ist new und delete nicht exceptionsafe, aber ich denke mal, dass du hier einen zeitkritischen Codeabschnitt hast oder nur aus Interesse fragst, sonst würdest du ja vector nutzen.
ja, ich bastle hobbymässig an einem zellularen automaten rum.
-
Gerade in zeitkritischem Code will man kein new und delete haben...

Abgesehen davon, gibt es keinen Grund, nicht zumindest Smart Pointer zu verwenden...

-
Oh, Stop! Nein, das sollte (ohne es jetzt zu pruefen) gar nicht kompilieren:
Every constant-expression in a noptr-new-declarator shall be an integral constant expression (5.19) and evaluate to a strictly positive value.
Das heisst, es darf 0 vorkommen, aber nur, wenn die Bounds zur Laufzeit vorgegeben werden. Wenn du da tatsaechlich 0 als Literal reinschreibst, dann darf das nicht kompilieren.
Ideone sagt hingegegen das Gegenteil, daher ist der GCC 4.8.1 in diesem Fall nicht standardkonform.
-
Sone schrieb:
Ideone sagt hingegegen das Gegenteil, daher ist der GCC 4.8.1 in diesem Fall nicht standardkonform.
Jo, zero size Arrays sind ein relativ verbreitete Spracherweiterung...

-
Sone schrieb:
Oh, Stop! Nein, das sollte (ohne es jetzt zu pruefen) gar nicht kompilieren:
Every constant-expression in a noptr-new-declarator shall be an integral constant expression (5.19) and evaluate to a strictly positive value.
(strictly positive heisst, nicht negativ und nicht null)
Das heisst, es darf 0 vorkommen, aber nur, wenn die Bounds zur Laufzeit vorgegeben werden. Wenn du da tatsaechlich 0 als Literal reinschreibst, dann darf das nicht kompilieren.Ideone sagt hingegegen das Gegenteil, daher ist der GCC 4.8.1 in diesem Fall nicht standardkonform.
hm und wie ist es, wenn es etwa so aussieht?
class c { bool *_d; c(); public: c(unsigned l) : _d(new bool[l]) {} }; int main() { c instance(0); }hier schreibe ich in die eckigen klammern des new[]-operators selbst kein literal rein, die variable l lässt sich jedoch auf ein literal zurückführen. ist das dann okay?
-
doktor banane schrieb:
hier schreibe ich in die eckigen klammern des new[]-operators selbst kein literal rein, die variable l lässt sich jedoch auf ein literal zurückführen. ist das dann okay?
Ja, aber wofür brauchst du das genau?
-
Das ist ok, denn in diesem Fall ist l keine constant expression.
Ganz sicher bin ich nicht, warten wir auf camper.
-
Sone schrieb:
Ganz sicher bin ich nicht, warten wir auf camper.
Es stimmt schon so wie du sagst. Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden. Zero sized Arrays werden als Spracherweiterung allerdings von vielen Compilern unterstützt...
-
doktor banane schrieb:
ja, ich selbst schreibe ja in meinem code natürlich nicht, dass ich 0 elemente mit new[] erzeugen will, eher wird die anzahl der elemente durch eine berechnung bestimmt, welche unter umständen auch 0 ergeben kann.
dot schrieb:
Gerade in zeitkritischem Code will man kein new und delete haben...

Ja. Die Abfrage, ob der Wert gültig ist, ist deutlich effizienter, als ein unnötiger new[] oder delete[] call.
-
[/quote]als Spracherweiterung[/quote]Hmm ...
http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory
-
knivil schrieb:
als Spracherweiterung
Hmm ...
http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memoryWie gesagt,
new T[0]ist durch eine Ausnahmeregelgung laut Standard erlaubt,T blub[0];dagegen nicht, wird aber von einigen Compilern dennoch unterstützt...
-
Wie gesagt, new T[0] ist durch eine Ausnahmeregelgung laut Standard erlaubt
Nein, ist es ja gerade nicht!
Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden.
Hast du überhaupt meine Zitate gelesen/verstanden?
Es ging nie um normale Arrays, meine Zitate bezogen sich alle auf
new. Und mein letztes hat AFAICS klar gezeigt, dass es nicht erlaubt ist... bzw. sein sollte.
-
Also laut Sutter ist new T[0] erlaubt:
http://herbsutter.com/2009/09/02/when-is-a-zero-length-array-okay/ich habe nur keinen Standard bei der Hand aber prinzipiell vertraue ich Sutter bei sowas blind.
-
Ja, Sutter hat Recht. Ich habe mich vertan, bei den Zitaten...
-
Sone schrieb:
Wie gesagt, new T[0] ist durch eine Ausnahmeregelgung laut Standard erlaubt
Nein, ist es ja gerade nicht!
Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden.
Hast du überhaupt meine Zitate gelesen/verstanden?
Nach meiner Interpretation kommt der Part mit der constant expression nur bei mehrdimensionalen Arrays zu tragen, was auch Sinn macht...

-
dot schrieb:
Nach meiner Interpretation, kommt der Part mit der constant expression nur bei mehrdimensionalen Arrays zu tragen, was auch Sinn macht...

Jetzt hast du mich aber am Haken. Wie interpretierst du das denn genau?

Oh.... verdammt... du hast Recht. Das bezieht sich auf Multidimensionale Arrays... ich wusste, da stimmt was nicht... ja, ich habe die Zitate nicht verstanden, verdammt. Die sind auch immer sowas von nicht selbsterklärend.
Ja, da hast du Recht. Bei Multidimensionalen Heap-Arrays müssten die zusätzlichen Dimensionen alle konstant und strikt positiv sein. Sonst kann auch 0 benutzt werden. Das heißt der Code im OP ist richtig.
hier schreibe ich in die eckigen klammern des new[]-operators selbst kein literal rein, die variable l lässt sich jedoch auf ein literal zurückführen. ist das dann okay?
Es wäre auch Ok, wenn du das Literal direkt reinschreibst, wie du siehst, habe ich mich vertan....

-
Muss aber zugeben, ich hab mich davon auch erstmal verwirren lassen...

-
Sone schrieb:
Ganz sicher bin ich nicht, warten wir auf camper.
Sone schrieb:
Ja, Sutter hat Recht. Ich habe mich vertan, bei den Zitaten...
Sone schrieb:
Oh.... verdammt... du hast Recht. Das bezieht sich auf Multidimensionale Arrays... ich wusste, da stimmt was nicht... ja, ich habe die Zitate nicht verstanden, verdammt. Die sind auch immer sowas von nicht selbsterklärend.
Wieder ein typischer Sone-Multifail.
Im Gegensatz zur Situation vor einem Jahr hat sich eigentlich nur geändert, dass Du ständig den Standard zitierst aber kaum verstehst was drin steht.
Endlich mal Fresse halten?
-
dass Du ständig den Standard zitierst aber kaum verstehst was drin steht.
Nein, ich verstehe prinzipiell gut was drin steht. Das war ein verwirrender Fall.
Zeig mir nochmal den letzten, wo ich den Standard zitiere und "kaum verstehe was drin steht".
Endlich mal Fresse halten?
Wieso sollte ich?
Btw, was genau ist ein Multifail? Ich hatte nur ein Zitat falsch gedeutet, das ist alles. Und dabei das richtige noch im ersten Post gebracht. Das ist nichts schlimmes. Aber ich wusste genau, das gleich der nächste Spinner ankommt und das für seine Anti-Sone Kampagne ausnutzt.
-
okay, ich habe die diskussion soweit passiv beobachtet und bedanke mich nun für die aufklärung.