PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ und was tun, wenn "new" nicht geht


Gast
2007-10-09, 09:23:15
hallo

Ich habe gerade gelesen, daß new auch fehlschlagen kann, wenn das System dem Prozeß keinen Speicher mehr geben kann.

Was mich jetzt gerade beschäftigt: was macht man dann? Wie erkenne ich das new fehlgeschlagen ist und was macht man dann am Besten?

Sollte man irgendwie versuchen den Speicher aufzuräumen (wenn das geht) oder versuchen das Programm noch sauber runterzufahren oder wenn new schon fehlschlägt ist sowieso alles vorbei, da kann ich auch gleich tschüß und exit(-1) sagen?

ScottManDeath
2007-10-09, 09:33:09
Du kannst die std::bad_alloc exception abfangen und dann mit einer Fehlermeldung sterben =)



try
{
int* urx = new int [0xdeadbeaf];
delete[] urx;
}
catch (std::bad_alloc e)
{
cout << "error allocating memory " << e.what() <<endl;
}

pest
2007-10-09, 10:06:02
obige Variante ist am Besten auf keinen Fall sowas wie in C-Zeiten machen also



int *urx = new int [0xdeadbeaf];
if (!urx) exit(-1)

Gast
2007-10-09, 11:15:17
obige Variante ist am Besten auf keinen Fall sowas wie in C-Zeiten machen also



int *urx = new int [0xdeadbeaf];
if (!urx) exit(-1)


Du hast die Fehlermeldung vergessen.

richtig wäre es so:

int *urx = new int [0xdeadbeaf];
if (!urx)
{
cerr << "Kein Speicher mehr vorhanden!" << endl; // Diese Zeile gibt dir dann auch eine Fehlermeldung.
exit(-1)
}

pest
2007-10-09, 11:20:18
wenns eh nicht geht ist die Fehlermeldung unsinnig. :wink:
"urx" hat immer einen wert != 0.

lizardking
2007-10-09, 12:15:14
Alternativ kannst du auch einen globalen new_handler setzen, der einfach eine Funktion darstellt, in die bei einem Problem mit new verzweigt wird:

http://msdn2.microsoft.com/en-us/library/5fath9te(VS.80).aspx

Gast
2007-10-09, 12:34:59
wenns eh nicht geht ist die Fehlermeldung unsinnig. :wink:
"urx" hat immer einen wert != 0.

Es funktioniert aber und die Fehlermeldung wird ausgegeben.
Probier es einfach aus.

Coda
2007-10-09, 12:51:56
Es funktioniert nicht wenn du einen standardkonformen Compiler hast.

MikeB
2007-10-12, 19:08:46
new (std::nothrow) int [0xdeadbeef]

Liefert NULL zurück, statt eine exception zu werfen.

ScottManDeath
2007-10-12, 22:57:50
new (std::nothrow) int [0xdeadbeef]

Liefert NULL zurück, statt eine exception zu werfen.

Och menno, da wolllte ich nun schon die Welt verbess0rn und Du machst es mir kaputt indem Du altmodische/schwer handhabare Fehlerbehandlungsmethoden propagierst ;(

MikeB
2007-10-12, 23:10:48
:D

Monger
2007-10-13, 00:34:30
obige Variante ist am Besten auf keinen Fall sowas wie in C-Zeiten machen also


int *urx = new int [0xdeadbeaf];
if (!urx) exit(-1)


Jaja, das berühmte "If Error then exit". Macht auch in anderen Sprachen Spaß, wenn Leute jede Exception fangen, um dann wortlos, aber prompt und schmerzhaft das Programm zu töten.

Erinnert mich schmerzlich daran, dass ich solches Zeug wieder nächste Woche auf Arbeit sehen werde. Uargh.