Dynamische Speicherverwaltung new bzw. delete



  • Hallo zusammen hab ein Bsp-Aufgabe aus nem Skript zu dynamischer Speicherverwaltung.

    #include <iostream>
    
    int * ptr1;
    
    int main ()
    {
    
    int* ptr2 = new int(5);
    int* prt3 = new int[100];
    
    delete ptr1; 
    delete ptr2;
     delete ptr3;
    }
    

    Frage dazu aus dem Skript

    1. Was passiert bei new int (5) bzw new int[100]?
    2. Korrigiere die Fehler bei den delete Zeilen.

    Meine Antwort
    1)
    new int(5) ein dynamisch erzeugtes INT-Objekt das mit 5 initialiesiert wird.
    new int[100] ein dynamisch erzeugtes INT-Array das 100 Elemente reserviert.

    delete ptr1; -> Fehler da Pointer nicht auf Objekt zeigt-
    delete ptr2; -> ist ok
    delete[] ptr3;-> [] fehlten da ptr3 ein Int Array Zeiger

    Jetzt meine Frage dazu 🙂

    ich verstehe nicht wie man bei dieser zeile "new int(5)" ein int Objekt erzeugen kann dass mit 5 initialiesiert wird dachte das geht nur mit new KLASSENNAME()

    bei dem int Arry hab ich das gleiche Problem ein int Array das 100 elemente reserviert hat aber wie kann ich die elemente ansprechen??

    danke für euren Support



  • Deine Antworten sehen richtig aus.

    brichun schrieb:

    ich verstehe nicht wie man bei dieser zeile "new int(5)" ein int Objekt erzeugen kann dass mit 5 initialiesiert wird dachte das geht nur mit new KLASSENNAME()

    Genereller: TYPNAME statt KLASSENNAME. "int" ist ein Typ und hat (u.a.) einen Konstruktor, dem ein int übergeben werden kann.

    brichun schrieb:

    wie kann ich die elemente ansprechen??

    ptr3[20] = 123;



  • 1. Ja
    2. Ja, Ja, Nein (du hast hier Abweichungen von deinem Codebeispiel)

    bei dem int Arry hab ich das gleiche Problem ein int Array das 100 elemente reserviert hat aber wie kann ich die elemente ansprechen??

    Mit ptr3[0], ptr3[1], ... ptr3[99].



  • Badestrand schrieb:

    brichun schrieb:

    ich verstehe nicht wie man bei dieser zeile "new int(5)" ein int Objekt erzeugen kann dass mit 5 initialiesiert wird dachte das geht nur mit new KLASSENNAME()

    Genereller: TYPNAME statt KLASSENNAME. "int" ist ein Typ und hat (u.a.) einen Konstruktor, dem ein int übergeben werden kann.

    Nicht wirklich, aber der Compiler tut so als ob int einen Konstruktor hätte.



  • brichun schrieb:

    delete ptr1; -> Fehler da Pointer nicht auf Objekt zeigt-

    Zu ptr1: Nicht, weil er auf kein Objekt zeigt, sondern weil er nicht initialisiert wurde.
    Zum Beispiel...

    int* ptr1 = NULL;
    

    ...zeigt auch auf kein Objekt. Trotzdem ist hier delete ptr1 erlaubt.



  • int* ptr1 = NULL;

    habs gerade ausprobiert es kommt eine Fehlermeldung: error C2065: 'Null': nicht deklarierter Bezeichner

    @all
    Danke für die schnelle Hilfe



  • Dann nimmt int *ptr1 = 0;

    Ansprechen geht auch per *(ptr2+30) = 10 was das selbe ist wie ptr2[30] = 10. Oder mit *(30+ptr2) = 10;



  • globale variablen werden aber mit 0 initialisiert

    1. funktioniert also



  • Fellhuhn schrieb:

    Dann nimmt int *ptr1 = 0;

    Ansprechen geht auch per *(ptr2+30) = 10 was das selbe ist wie ptr2[30] = 10. Oder mit *(30+ptr2) = 10;

    Oder 30[ptr2] = 10;



  • Das sieht mir alles sehr reaktiv aus.



  • brichun schrieb:

    int* ptr1 = NULL;

    habs gerade ausprobiert es kommt eine Fehlermeldung: error C2065: 'Null': nicht deklarierter Bezeichner

    Null != NULL
    🙄


Anmelden zum Antworten