Frage zur dyn. Arrays!



  • hi leute..kann mir jemand den unterschied zwischen:

    int *p = new int[3];
    	p[1] = 123;
    	cout << p[1] << endl;
    

    und

    int *p = new int;
    	p[1] = 123;
    	cout << p[1] << endl;
    

    erklären???

    danke!



  • Hallo,

    brainwave81 schrieb:

    hi leute..kann mir jemand den unterschied zwischen:

    int *p = new int[3];
    	p[1] = 123;
    	cout << p[1] << endl;
    

    Hier wird ein dynamisches Array vom Typ int mit 3 Feldern angelegt. Sollte man mit

    delete [] p;
    

    wieder freigeben.

    und

    int *p = new int;
    	p[1] = 123;
    	cout << p[1] << endl;
    

    Du allokierst nur Platz für 1 int. Greifst aber darauf zu, wie auf ein Array mit min. 2 Feldern (index geht ja bei 0 los), d.h. du eierst hier irgendwo im Speicher rum. Würde mich nicht wundern, wenn dein Programm mit nem Segmentation Fault abstürzen würde.

    Korrekt:

    int *p = new int;
    	*p = 123;
    	cout << *p << endl;
        delete p;
    

    Hier den Speicher wieder mit

    delete p;
    

    freigeben.

    MfG

    GPC



  • wie sieht die freigabe eigentlich in diesem fall aus:

    int* p=new int[1];
    

    reicht dann ein

    delete p;
    

    aus oder ist ein

    delete [] p;
    

    dennoch angebracht oder gar pflicht?



  • dann ist es zufall das bei beiden die gleichen werte angezeigt werden!
    als bei einem array -> [grösse] sonst nicht!



  • Man muss laut Standard die zweite Version, also

    delete [] p;
    

    verwenden. Das andere erzeugt undefiniertes Verhalten.



  • Man muss laut Standard die zweite Version, also

    delete [] p;
    

    verwenden

    Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann. 😕

    Tschau,
    gaerh



  • haehr schrieb:

    Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche,

    Um ein einzelnes Objekt von einem beliebigen Typ dynamisch zu allokieren und wieder freizugeben. Niemals mischen!!

    //Böse:
    int *p=0;
    p = new int;  //einzelnes int allokieren
    //mit p arbeiten
    
    delete [] p;  // FEHLER: Falscher Operator delete []
    //Richtig ist:
    delete p;
    
    p = new int[5];  //Array allokieren
    //mit p arbeiten
    
    delete p;   // FEHLER: Falscher Operator delete
    //Richtig ist:
    delete [] p;
    

    wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann. 😕

    Kann man, aber nur für dynamisch allokierte Arrays.

    MfG

    GPC



  • haehr schrieb:

    Man muss laut Standard die zweite Version, also

    delete [] p;
    

    verwenden

    Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann. 😕

    Tschau,
    gaerh

    Ein mit new[] erzeugtes Objekt verbraucht etwas mehr Speicher, je nach Compiler, weil die Anzahl der Objekte noch gespeichert werden muss.

    mfg.



  • joomoo schrieb:

    Ein mit new[] erzeugtes Objekt verbraucht etwas mehr Speicher, je nach Compiler, weil die Anzahl der Objekte noch gespeichert werden muss.

    Das dürfte doch aber bei heutigen Speichergrößen fast egal sein, oder?



  • haehr schrieb:

    Mir ist dann allerdings nicht so ganz klar wofür ich dann eigentlich noch new und delete brauche, wenn man genauso new int[1](bzw. jeder andere Typ) und delete[] verwenden kann. 😕

    Schon mal bei der Instanzierung initialisiert? 😉


Anmelden zum Antworten