new-handler



  • 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



  • kannst ignorieren kein gängiges system ist noch benutzbar wenn es tatsächlich keinen speicher mehr gibt, die machen schon vorher schlapp



  • Du meinst Operator new? Das ist relativ einfach.

    void* operator new(std::size_t size) throw(std::bad_alloc)
    {
    	void* p = /* hier mittels deines Speichermanagers den benoetigten Speicher (size) reservieren */;
    	if (!p)
    		throw std::bad_alloc();
    	return p;
    }
    

    Du solltest aber darauf achten, zu jedem Operator new einen passenden Operator delete zu implementieren.

    void operator delete(void* p) throw()
    {
    	/* hier mittels deines Speichermanagers den reservierten Speicher (p) freigeben */
    }
    

    Die Funktionen müssen, sofern es die globen Operatoren new/delete sein sollen, auch im globalen Namensraum implementiert sein.
    Selbiges ist übrigens genauso mit new[]/delete[] möglich.


  • Mod

    sharif schrieb:

    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

    das ist nicht weiter schwer:

    void (*old_handler)();
    void my_handler()
    {
        // besorg mehr speicher
        // optional rufen wir den alten handler auf
        if ( kein_speicher && old_handler != 0 )
        {
            old_handler();
            return;
        }
        if ( fehler )
        {
            throw std::bad_alloc(); // oder
            exit(foo); // oder
            abort();
        }
    }
    // und dann irgendwo installieren:
    
    old_handler = std::set_new_handler( my_handler );
    
    // und ggf. wieder deinstallieren
    
    std::set_new_handler( old_handler );
    

    sonderlich sinnvoll ist das im allgemeinen nicht. man könnte es auch für logging zwecke verwenden. im embedded bereich hat es möglicherweise größere bedeutung.


Anmelden zum Antworten