Pointer & new-Operator



  • [cpp]Hi!

    Ich muss demnächst einen Test in C++ bestreiten und es gibt eine Testsammlung aus den Vorjahren. Darunter ist folgende Frage:

    Das folgende Programmfragment ist problematisch:
    {
    int *abc = new int;
    *abc = 100000;
    .......
    }
    Schlagen Sie Korrekturen vor und erklären Sie warum diese notwendig sind!

    Ich vermute es soll in etwa so ausgebessert werden:

    int *abz;
    abz = new int;
    *abz = 100000;

    Das einzige was ich nicht verstehe ist, worin der Unterschied besteht. Könnte mir das jemand kurz erklären?

    Thanks
    Jarvis



  • Das ist nicht die Lösung. Was gehört zu jedem new?



  • { 
    int *abc = new int; 
    *abc = 100000; 
    ....... 
    }
    

    ist genau das gleiche wie

    int *abz; 
    abz = new int; 
    *abz = 100000;
    ......
    

    ausser dass du im zweiten Codeausschnitt die Deklaration und Initialisierung trennst.

    Das problematische an dem Codefragment ist wohl eher die Frage, wo der Speicher wieder freigegeben wird. Speicher, den durch 'new' angelegt wird, wird nicht automatisch freigegeben. Der muss irgendwo explizit durch 'delete' gelöscht werden sonst gibt es Probleme - Stickwort 'memory leaks'.



  • Wow, das ging schnell!

    Danke für die Antworten und für die simple Lösung...

    Zwei Fragen hätt ich noch:

    Das folgende Programmfragment ist fehlerhaft:
    bool test = bound1 && bound2;
    if test {
    // .......
    } else {
    // .......
    }
    Korrigieren Sie die Fehler im Programmcode und erklären Sie, warum die Korrekturen
    notwendig sind!

    und

    Das folgende Programmfragment ist fehlerhaft:
    int xyz;
    xyz = 123450000;
    int xyz_ptr = &xyz;
    delete xyz_ptr;
    Schlagen Sie Korrekturen vor und erklären Sie warum diese notwendig sind!



  • Beim ersten fehlen die runden Klammern beim if.
    Beim zweiten fehlt dem "Pointer" das Sternchen und es wird versucht delete auf ihn aufzurufen, obwohl er nicht auf Speicher zeigt, das von new angelegt wurde.



  • Beim ersten fehlen Klammern um das if.
    Beim zweiten ist xyz_ptr kein Pointer. Das delete auf ein Stackobjekt macht natürlich auch keinen Sinn, wobei ich mich frage, was man da als Korrektur vorschlagen soll. delete raus hauen? Aber irgendwie steht der ganze Code ja in keinem Zusammenhang, da finde ich, dass das Weglassen von Dingen eigentlich nicht mehr in der Menge der korrekten Möglichkeiten liegt. Na ja, da musst du wohl fragen.

    Edit: Zu spät.



  • Vielen vielen Dank 🙂



  • Ehrlich gesagt, hatte ich zunächst gedacht, dass das delete irgendwo hinter den Punkten versteckt sei. Mein erster Gedanke war: Man sieht dort nicht den Sinn der Heapallozierung -> die ist eventuell überflüssig ->

    int abz = 100000;
    

    😉


Anmelden zum Antworten