001
22.06.2006, 13:32 Uhr
virtual
Sexiest Bit alive (Operator)
|
Für die meisten Programme braucht man sowas nicht...
Also, wens interessiert: wenn new keinen Speicher mehr bekommt, wird der new_handler aufgerufen, das ist die Funktion, welche man mittels set_new_handler setzt. Per default wirft die voreingestellte Funktion ein std::bad_alloc.
Will man selbst eine Funktion schreiben, dann sollte sie keinen Parameter erwarten und void als rückgabe wert haben. Ausserdem sollte die Routine nur dann "normal" zurückkehren, wenn sie irgendwie speicher belegen konnte.
Damits halbwegs sinnvoll wird, habe ich mal ein Beispiel geschrieben: wird der handler aufgerufen, gibt er zunächst was resevespeicher frei. Wird danach nochmal der Handler aufgerufe., wird eine bas_alloc exception geworfen. Damits schnell geht, arbeite ich mit großen Speicherblöcken:
C++: |
#include <new> #include <iostream>
static char* last_resort_mem = new char[40960*1024];
void my_handler () { if (last_resort_mem!=NULL) { delete[] last_resort_mem; last_resort_mem = NULL; std::cerr<<"Beenden Sie bitte das Programm - der Speicher ist gleich alle!"<<std::endl; } else { std::cerr<<"Speicher alle! Programm beendet sich nun!"<<std::endl; throw std::bad_alloc(); } }
int main( void ) { set_new_handler(&my_handler); while(true) { new int[1024*1024]; std::cerr<<"Allocated 1 MB"<<std::endl; } }
|
Ausgabe:
Code: |
... Allocated 1 MB Allocated 1 MB Allocated 1 MB Beenden Sie bitte das Programm - der Speicher ist gleich alle! Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Allocated 1 MB Speicher alle! Programm beendet sich nun! Abort (core dumped)
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |