eines Zeiger-Programm



  • 314159265358979 schrieb:

    krueemel schrieb:

    if(*pointer = new int != NULL)
    

    sollte eigentlich heißen:

    if(*(pointer = new int) != NULL)
    

    sollte eigentlich heißen:

    if ((pointer = new(nothrow) int))
    

    Und Zeile 16 ist sinnlos.

    Edit: Hach ja.. mit nothrow kann man doch gleich wieder wie in C Programmieren. *g*



  • 314159265358979 schrieb:

    krueemel schrieb:

    if(*pointer = new int != NULL)
    

    sollte eigentlich heißen:

    if(*(pointer = new int) != NULL)
    

    Müsste das nicht

    if(pointer = new int != NULL)
    

    heißen?

    Edit: zu spääääääät (eine verdammte sekunde!)


  • Mod

    314159265358979 schrieb:

    krueemel schrieb:

    if(*pointer = new int != NULL)
    

    sollte eigentlich heißen:

    if(*(pointer = new int) != NULL)
    

    Jetzt ist es zwar grammatikalisch richtig, aber dennoch falsch. new gibt kein NULL zurück, wenn es fehlschlägt, sondern wirft eine std::bad_alloc.

    edit: Das bezieht sich nicht nur auf 314159265358979s Antwort, sondern auch auf die anderen beiden gleichen Inhalts, die in der Zwischenzeit erschienen sind.



  • krueemel schrieb:

    Beim Compilieren ist kein Fehler.

    Bei mir kommt aber eine Warnung und bei dir sicherlich auch (ansonsten dreh mal dein Warnlevel hoch). Warnungen sollte man nicht ignorieren!



  • ich habe es jetzt wie folgt geändert:

    int *pointer = = new int;
    
        if(*pointer != NULL)
    

    So läuft es auf jeden Fall. Macht jetzt die if-Abfrage auch Sinn?



  • Das ist sehr falsch,
    mach das zweite Gleichheitszeichen weg, alter.
    Und ich glaube, du verstehst nicht den Unterschied zwischen

    pointer != NULL

    und

    *pointer != NULL

    mit dem dereferenzierungs-operator ('*') greift man auf den Inhalt eines Zeigers, also auf seinen pointee zurück; wenn du überprüfen willst, ob der Zeiger auf einen gültigen Speicherbereich zeigt muss dieser Operator weg.

    also

    if(!pointer)
    {
        //Der Zeiger ist ungültig
    }
    


  • Und mach das if weg. Wie SeppJ schon erwähnt hat, kann pointer nicht 0 sein, sondern es wird eine Exception geworfen, wenn kein Speicher vorhanden ist. Wenn du schon dabei bist, mach auch noch das new int weg und schreib einfach

    int foo = 0;
    


  • und wie kann ich abfragen, ob genügend Speicher vorhanden ist?

    in C geht das doch auch:

    if((pointer = malloc(sizeof(int))) != NULL)
    


  • Michael E. schrieb:

    Und mach das if weg. Wie SeppJ schon erwähnt hat, kann pointer nicht 0 sein, sondern es wird eine Exception geworfen, wenn kein Speicher vorhanden ist.

    Gabs da nicht so ein schönes set_new_handler?



  • krueemel schrieb:

    und wie kann ich abfragen, ob genügend Speicher vorhanden ist?

    Entweder du machst es mit nothrow, oder du verlässt dich darauf, dass genug Speicher vorhanden ist (weil Fehlerbehandlung eh keinen Sinn machen würde), oder du fängt std::bad_alloc.



  • new (std::nothrow) T;
    

  • Mod

    Und warum den eingebauten Exceptionmechanismus durch eine umständlichere Rückfallvariante ersetzen? Nutz die Exceptions!



  • Hacker schrieb:

    Gabs da nicht so ein schönes set_new_handler?

    Ja, Meyers schreibt auch viel dazu (weiß der Geier warum). Gebraucht hab ichs noch nie, weil ich auf normalen Computern den Sinn nicht sehe.


Anmelden zum Antworten