Pointer löschen
-
Warum funktioniert das Programm nicht mehr, wenn ich in der while Schleife ptemp
lösche???int schueler=0; float zensurengesamt=0; float *pzensuren=new float[10]; cout << "Eingabe der Zensuren:" << "\n"; while(true) { cin >> pzensuren[schueler]; if(pzensuren[schueler]==0) break; float *ptemp=new float[schueler+1]; ptemp = pzensuren; cout << ptemp[schueler] << "\n"; cout << schueler << "\n"; delete[] ptemp; schueler+=1; }
-
ptemp = pzensuren;
deswegen! du löschst nicht etwa das, was du mit float *ptemp=new float[schueler+1]; erzeugt hast, sondern das, was du mit float *pzensuren=new float[10]; erzeugt hast.
-
Hi!
Ich glaube du hast nicht verstanden was ich im letzten Thread geschrieben habe, denn das
float *ptemp=new float[schueler+1]; ptemp = pzensuren;
kann ja nichts werden! Du reservierst speicher und dann lässt du den Zeiger ptemp auf den Speicherbereich von pzensuren zeigen. Hier findet kein kopieren des Arrays statt, sondern ein kopieren der Adresse vom einen Pointer zum anderen. Außerdem reservierst du schon wieder falsch. Oben hast du 10 elemente und in der Schleife reservierst du nur 2 Elemente. Erstmal solltest du schueler auf 10 setzen, dann dies bei der Reservierung für ptemp einsetzen:
size_t schueler=10; float zensurengesamt=0; float *pzensuren=new float[schueler];
Dann geht es schonmal was du vorhast, dann würde nämlich ptemp später 11 Elemente aufnehmen können. Das kopieren geht jetzt so:
for(size_t i=0; i<schueler; ++i) ptemp[i] = pzensuren[i];
Danach kannst du in pzensuren löschen und lässt es auf den speicherbereich von ptemp zeigen:
delete[] pzensuren; pzensuren=ptemp;
ptemp wird ausnahmsweise NICHT(!) freigegeben, da du den Speicherbereich ja weiterhin benötigst. Dieser wird immer durch das delete[] pzensuren feigegeben.
Jetzt kannst du in der Schleife immer wieder neue Daten hinzufügen, dabei nicht vergessen schueler immer um 1 zu inkrementieren. Nach der schleife kannst du dann eine Schleife zur Ausgabe erzeugen:
for(size_t i=0; i<schueler; ++i) cout << pzensuren[i] << '\n';
Am Ende gibst du nun den Speicherbereich von pzensuren frei. Somit hast du keine Speicherlecks mehr.
Code-Hacker
-
was ist size_t?
-
jkarts schrieb:
was ist size_t?
Im Prinzip "unsigned int", ist halt ein universeller Größentyp (STL-Container arbeiten z.B. damit), man sieht vor allem schön, dass es eine Größenangabe ausdrücken soll...
(schon mal was von den Rittern des size_t gehört)
-
Hi!
Nein, nur in C ist size_t unsingned int. In C++ ist es ein eigener Typ. Wird meistens bei Index- und Längenangaben verwendet.
Code-Hacker