Frage zur dyn. Arrays!
-
hi leute..kann mir jemand den unterschied zwischen:
int *p = new int[3]; p[1] = 123; cout << p[1] << endl;und
int *p = new int; p[1] = 123; cout << p[1] << endl;erklären???
danke!
-
Hallo,
brainwave81 schrieb:
hi leute..kann mir jemand den unterschied zwischen:
int *p = new int[3]; p[1] = 123; cout << p[1] << endl;Hier wird ein dynamisches Array vom Typ int mit 3 Feldern angelegt. Sollte man mit
delete [] p;wieder freigeben.
und
int *p = new int; p[1] = 123; cout << p[1] << endl;Du allokierst nur Platz für 1 int. Greifst aber darauf zu, wie auf ein Array mit min. 2 Feldern (index geht ja bei 0 los), d.h. du eierst hier irgendwo im Speicher rum. Würde mich nicht wundern, wenn dein Programm mit nem Segmentation Fault abstürzen würde.
Korrekt:
int *p = new int; *p = 123; cout << *p << endl; delete p;Hier den Speicher wieder mit
delete p;freigeben.
MfG
GPC
-
wie sieht die freigabe eigentlich in diesem fall aus:
int* p=new int[1];reicht dann ein
delete p;aus oder ist ein
delete [] p;dennoch angebracht oder gar pflicht?
-
dann ist es zufall das bei beiden die gleichen werte angezeigt werden!
als bei einem array -> [grösse] sonst nicht!
-
Man muss laut Standard die zweite Version, also
delete [] p;verwenden. Das andere erzeugt undefiniertes Verhalten.
-
Man muss laut Standard die zweite Version, also
delete [] p;verwenden
Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann.

Tschau,
gaerh
-
haehr schrieb:
Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche,
Um ein einzelnes Objekt von einem beliebigen Typ dynamisch zu allokieren und wieder freizugeben. Niemals mischen!!
//Böse: int *p=0; p = new int; //einzelnes int allokieren //mit p arbeiten delete [] p; // FEHLER: Falscher Operator delete [] //Richtig ist: delete p; p = new int[5]; //Array allokieren //mit p arbeiten delete p; // FEHLER: Falscher Operator delete //Richtig ist: delete [] p;wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann.

Kann man, aber nur für dynamisch allokierte Arrays.
MfG
GPC
-
haehr schrieb:
Man muss laut Standard die zweite Version, also
delete [] p;verwenden
Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann.

Tschau,
gaerhEin mit new[] erzeugtes Objekt verbraucht etwas mehr Speicher, je nach Compiler, weil die Anzahl der Objekte noch gespeichert werden muss.
mfg.
-
joomoo schrieb:
Ein mit new[] erzeugtes Objekt verbraucht etwas mehr Speicher, je nach Compiler, weil die Anzahl der Objekte noch gespeichert werden muss.
Das dürfte doch aber bei heutigen Speichergrößen fast egal sein, oder?
-
haehr schrieb:
Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann.

Schon mal bei der Instanzierung initialisiert?
