Wie Speicherfehler behandeln


  • Mod

    Hindman schrieb:

    In deinem konkreten Beispiel wird gar kein Speicher dynamisch alloziert. Der String landet im Binary einfach im Textsegment. In Java sieht das natürlich anders aus 🙂

    Es wird ein std:string konstruiert, und dabei muss das Literal irgendwohin kopiert werden.



  • camper schrieb:

    Es wird ein std:string konstruiert, und dabei muss das Literal irgendwohin kopiert werden.

    In manchen Implementierungen von std::string stehen ein paar Bytes zur Verfügung um dort kurze Strings einfach ablegen zu müssen. Kann man aber natürlich nicht von ausgehen.



  • Ein vernüftiges Vorgehen ist also mit set_new_handler einen new- handler installieren und dort die speicherknappheit gehandeln (wie auch immer).

    Korrekt?



  • Vielen Dank,

    ich werde es jetzt folgendermaßen machen.
    Für jede Klasse den new Operator überladen und die set_new_handler Funktion benutzen.

    mfg



  • Eine Frage ist mir noch eingefallen.
    Gibt es eine möglichkeit den operator new für die standart Typen wie int oder float zu überladen?



  • Was spricht gegen ein catch bad_alloc in main, wenn man davon absieht, dass bad_allocs in der Konstruktion globaler Objekte nicht gefangen würden?



  • plongor schrieb:

    Eine Frage ist mir noch eingefallen.
    Gibt es eine möglichkeit den operator new für die stan**** Typen wie int oder float zu überladen?

    Du kannst den globalen Operator new überladen, also für ALLE Typen. Für einzelne ausgewählte build ins soweit ich weiß allerdings nicht.



  • So, jetzt funktioniert alles wie ich es wollte.
    Eine allerletzte Frage habe ich aber noch.
    Woher weiß ich wieviel Speicher mein Programm auch ohne new Anfragen benutzt?
    Das muss der Compiler bzw. das Betriebsystem ja vorher wissen.
    wenn ich zum Beispiel

    void foo( void )
    {
        char test[ 100 ];
    }
    
    int main( int argc, char** argv )
    {
        foo();
    }
    

    mache, muss das OS ja wissen, ob genügend Speicher vorhanden ist um die Funktion foo auszuführen. Wo werden die 100 Bytes dann überhaupt hingespeichert?
    Müssten die nicht eg intern dann auch wieder mit new angefordert werden?



  • Wo werden die 100 Bytes dann überhaupt hingespeichert?

    Auf dem Stack.



  • LordJaxom schrieb:

    Was spricht gegen ein catch bad_alloc in main, wenn man davon absieht, dass bad_allocs in der Konstruktion globaler Objekte nicht gefangen würden?

    Das müsste dann bei jedem Thread gemacht werden.
    Mit dem new handler wäre das "global" geregelt.

    Mein Verständnis für die std::bad_alloc oder den new handler sind so, dass wenns schief geht, ist es im allgemeinen nicht mehr so super und ich dann noch z.B. ein Log Eintrag erzeugen kann, bevor das Programm terminiert wird.

    Simon


Anmelden zum Antworten