Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » new-Handler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.06.2006, 15:12 Uhr
~sharif
Gast


Hallo leute.
Ich habe mal eine frage.
und zwar...weiss jemand von euch wie man einen new-Handler selbst implementiert?

für tipps wäre ich sehr erfreut

danke schonmal im voraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: