Speicher allokieren, Ausnahmefall erzwingen?
-
Hallo ich habe eine Frage und zwar wie ist es möglich (Teil einer Schufaufgabe)
im Folgenden Code den Ausnahmefall, nähmlich, dass nicht genug Speicher bereit steht um die Variable zu erzeugen, erzeugen?void main() { /*Wie kann ich hier den Ausnahmefall erzwingen?*/ int *p1; try { p1 = new int; if(p1==NULL) { cout << "Fehler kein Speicherplatz!\n"; } } catch(char * str) { cout << "Fehler aufgetreten: " << str << '\n'; } delete p1; }
Und ist sonst alles korrekt oder könnte man etwas verbessern?
Versteht mich nciht falsch ich will nicht dass ihr hier meine Hausaufgaben macht, unsere Aufgabe war einen alten C Code mit ähnlichem Inahlt in C++ Code umzuwandeln und zu untersuchen was im Ausnaahmefall passiert.
Also dass da oben ist mein equvivalent (+ausgebaut) zu:
#include <stdlib.h> #include <stdio.h> int main(void) { int * ip; ip = (int *) malloc(100000*sizeof(int)); if(!ip) { printf("Fehler: kein Speicherplatz! \n"); exit(1); } free(ip); }
Ist OK meiner Meinung nur, wie gesagt, wie soll ich den Ausnahmefall testen wenn ich nicht weis wie ich ihn herbei führe, weil warten bis er mal zufällig passiert will ich nicht *gg*
-
int main() { try { int p1 = new int[10000000]; delete pl; } catch(bad_alloc& e) { cout << "Fehler aufgetreten: " << e.what() << '\n'; } }
-
hab das mal nach deinem Vorschlag angepasst, aber damit bekomm icch immernoch kein ausnahmefall, wieso auch, seh da keinen grund?
void main() { /*Wie kann ich hier den Ausnahmefall erzwingen?*/ int *p1; try { p1 = new int[10000000]; if(p1==NULL) { cout << "Fehler kein Speicherplatz!\n"; } delete p1; } catch(bad_alloc& e) { cout << "Fehler aufgetreten: " << e.what() << '\n'; } //delete p1; Again(); }
-
nimm ne grössere zahl. 10mil is noch nicht so doll, ab > 512M müsste es eigentlich auf jeden fall fehlschlagen (32bit)
andererseits kannst du auch genausogut die exception selbst werfen :p
-
bigmama schrieb:
hab das mal nach deinem Vorschlag angepasst,...
da war gar kein grund mehr für anpassung. er war fertig. (außer natürlich, daß ich deine speichergröße falsch unterschätzt hab.) weil new eine bad_alloc schmeißt, weinn nicht mehrgenug speicher frei war. desdawegen braucht man auch nicht auf ==NULL zu testen, weil das niemals true ergeben kann. entweder gilt !=NULL oder man ist direkt aus dem new schon rausgeflögen bis in den catch-block. und pl lokaler zu machen und int main() zu screiben ist modernerer c++-stil.
auf welcher schule lernste das?
was ist Again()? doch nicht etwa
#define Again() {exit(main());}
?
-
Sorry hatte bis jetzt keine Zeit.
Also die funktion Again ist nur ne kleine Spielerei aller möchten sie das Programm nochmal bla bla, könnte man auch anderst machen, aber naja
Momentan studiere ich Allgemin Informatik Bachelor (AIB) an der Hochschule in Furtwangen.
Übrigends noch danke für eure Antworten und sorry dass ich so spät erst antworte
-
Musst du die Ausnahme über new erzwingen oder kannst du auch
throw( bad_alloc )
im try-Block schreiben?
-
ich sagte doch, das du alternativ auch die exception selbst werfen kannst. allerdings ist std::bad_alloc kein objekt sondern ein typ, folglich:
throw std::bad_alloc();
-
mein Fehler