Initialisiert new[] den speicher ?
-
Moin.
Mal ne frage, ist es garantiert das der speicher welcher von new intitialisiert
wird, mit einem wert vorbelegt wird ?char *pc = new char[400];
ist jetzt jedes element von pc initialisiert ?
Ich habs mit dem MSVC getested, und da ist es offensichtlich so,
ist das Stanard konform ?
-
Ja. Der Operator
new
ruft den Standardkonstruktor auf.
(Und new[] natürlich auch)
-
Optimizer schrieb:
Ja. Der Operator
new
ruft den Standardkonstruktor auf.
(Und new[] natürlich auch)gilt das auch für buildins ?
also int, char usw.
-
Theoretisch würde es schon gelten.
Nur haben diese Typen keinen Konstruktor, der sie auf irgendeinen Wert initialisiert.Mit anderen Worten in
char*pc= new char[400];
steht undefiniertes Gemüse drin.
-
Nein. Die built-in Typen haben auch einen Standardkonstruktor. Bei integralen Typen setzt er den Wert auf 0.
-
char*cf= new char[400]; for (int i=0;i<400;++i) cout<<static_cast<int>(cf[i])<<endl; cin.get();
Ausgabe meines Compilers:
-51
-51
..
-51
(400 Stück)
Also entweder ist -51 der Defaultwert oder es ist undefiniert (ich tendiere zu 2terem)
-
buildin schrieb:
Also entweder ist -51 der Defaultwert oder es ist undefiniert (ich tendiere zu 2terem
)
Weder noch. Du hast dich unglücklicherweise bei deinen Erklärungsversuchen zu sehr eingeschränkt und dabei eine dritte und hier zutreffende Möglichkeit vergessen, die da heißt: dein Compiler verhält sich in diesem Punkt nicht standard-konform.
Sowohl
new int[x];
als auch
new int[x]();
führen zu einer Default-Initialisierung aller x Member des Arrays und Default-Initialisierung für int heißt Zero-Initialisierung, sprich Initialisierung mit 0.
-
Das hatten wir vor nem halben Jahr schonmal. Vorsicht, der Thread ist ein wenig mit unqualifizierten Beiträgen zugemüllt, da musst du etwas sortieren:
http://www.c-plusplus.net/forum/viewtopic.php?t=79780Kurze Zusammenfassung: Es gibt einen Unterschied zwischen new T und new T(). Nur letzteres (mit Klammern) führt bei primitiven Typen eine Initialisierung aus. Allerdings halten sich einige Compiler nicht daran, was im Endeffekt bedeutet, dass du es doch manuell machen solltest.
EDIT: Öhm Hume, hat sich da in der Zwischenzeit was geändert? Seit wann macht new T auch eine Initialisierung?
-
Bashar schrieb:
EDIT: Öhm Hume, hat sich da in der Zwischenzeit was geändert? Seit wann macht new T auch eine Initialisierung?
Nein. Ich habe mich dummerweise nur auf einen NG-Beitrag verlassen statt 5.3.4p15 selbst zu lesen.
@all
Das:HumeSikkins schrieb:
Sowohl
new int[x];
als auch
new int[x]();
führen zu einer Default-Initialisierung aller x Member des Arrays und Default-Initialisierung für int heißt Zero-Initialisierung, sprich Initialisierung mit 0.
ist KÄSE.
Richtig ist:
Dasnew int[x];
führt zu einem Array von x ints mit *undefinierten* Werten.
Das hingegen:new int[x]();
führt zu einem Array von x ints die alle mit 0 initialisiert sind.
Sorry für die gestiftete Verwirrung.
-
HumeSikkins schrieb:
Richtig ist:
Dasnew int[x];
führt zu einem Array von x ints mit *undefinierten* Werten.
Das hingegen:new int[x]();
führt zu einem Array von x ints die alle mit 0 initialisiert sind.
verhalten sich im bezug darauf alle gängigen compiler standardkonform oder sollte ich besser bei memset bleiben?
-
Sovok schrieb:
verhalten sich im bezug darauf alle gängigen compiler standardkonform oder sollte ich besser bei memset bleiben?
Das kommt wohl darauf an, wie du "gängig" definierst. Der VC 6.0 z.B. initialisiert hier in beiden Fällen nicht.
Auf der anderen Seite: wozu überhaupt ein Array? Da du selbiges dynamisch erzeugst und da du alle Member initialisierren willst, sehe ich keinerlei Vorteile gegenüber einem std::vector.std::vector<int> v(10, 0);
-
HumeSikkins schrieb:
Sovok schrieb:
verhalten sich im bezug darauf alle gängigen compiler standardkonform oder sollte ich besser bei memset bleiben?
Das kommt wohl darauf an, wie du "gängig" definierst. Der VC 6.0 z.B. initialisiert hier in beiden Fällen nicht.
Ich weiss nicht was du unter intialisiert verstehst, aber bei
einem Test hat er allen chars in beidenfällen den wert null zu gewiesen...Devil
-
devil81 schrieb:
Ich weiss nicht was du unter intialisiert verstehst
Das wurde in diesem Thread allerdings bereits erklärt.
aber bei
einem Test hat er allen chars in beidenfällen den wert null zu gewiesenMein VC 6.0 Sp 5 führt weder hier:
int* p = new int[10];
noch hier:
int* p = new int[10]();
eine Default-Initialisierung durch. Im Debug-Modus initialisiert er die Elemente mit einem festen Pattern um Bereichsüberschreitungen erkennen zu können. Im Release-Modus sind die Elemente schlicht uninitialisiert.
Wenn das bei dir anders ist, welche Version (welches SP) verwendest du?
-
Wir haben glaube ich beide recht.
void allocchar(size_t size) { char *pc = new char[size]; for(int i =0; i < size; i++) std::cout << pc[i];//ist bei mir jetzt mit 0 allokiert. (habs mit char und int versucht.) delete[] pc; pc = new char[10]; for(int i =0; i < 10; i++) std::cout << pc[i];//ist bei mir jetzt _nicht_ mit 0 allokiert. (habs mit char und int versucht.) delete[] pc; }
Ergo, bei statische Allokierung macht er es nicht, wenn die Größe erst zur
Laufzeit feststeht tut er es anscheinend.Und was sagt der Standard jetzt dazu ?
Devil
-
devil81 schrieb:
Und was sagt der Standard jetzt dazu ?
Das wurde in diesem Thread bereits beantwortet.
-
was is mit
int* p = new int[10](100);
werden in dem fall alle ints mit 100 initialisiert?
-
werden in dem fall alle ints mit 100 initialisiert?
schön wärs. das kann c++ nicht.