dynamischer Speicherreservierung

Wir haben gesagt, dass Zeiger in den Speicher zeigen. Nun wäre es doch ideal wenn wir dorthin nicht nur zeigen könnten, sondern dort Variablen 'on the fly' erstellen könnten...

In C++ gibt es ein paar wichtige Speicherbereiche. 2 davon sind Stack und Heap (diese Namen sind nicht festgelegt, aber man nennt diese beiden Bereiche immer so - also ein quasi Standard).

Tip!!In C++ spricht man auch öfters vom Free Store, wenn man den Heap meint.

Der Stack ist ein Stapel der nach dem LIFO (Last In - First Out) Prinzip funktioniert. Das Element welches als letztes auf dem Stack gelegt wurde, wird als erstes rausgenommen. Auf diesem Stack werden alle Variablen angelegt die wir 'normal' in einer Funktion definieren haben. Sie werden nach Ende der Funktion auch wieder entfernt, dh, wir haben keine Arbeit.

Der Heap dagegen ist der Speicher für den wir selber verantwortlich sind. Wenn wir uns von dort Speicher holen müssen wir den Speicher selber wieder freigeben.

Der Vorteil eines Stacks ist der: sehr schneller Zugriff auf die Variablen, und keine Arbeit für den Programmierer, der Nachteil: eine begrenzte Größe! Und wir können die Lebenszeit einer Variablen nicht beliebig festlegen.

Der Vorteil eines Heaps ist der: nahezu unendlich viel Speicher (auf modernen 32 Bit Betriebssystemen (Windows, Linux) sind es 4 GB) und der Programmierer kann selber bestimmen wann eine Variable angelegt wird und wann sie zerstört wird. Der Nachteil ist, dass der Programmierer sich eben um alles kümmern muss.

Tip!!Damit man es nicht immer um das löschen eines am Heap angelegten Objektes kümmern muss, verwendet man das RAII-Idiom (zB Smart Pointer).
    int main()
    {
      int* i=new int;
      //das liest sich doch einfach, oder?
      //i ist ein neuer int, new sagt uns, dass wir Speicher
      //fuer einen int wollen. und i zeigt nun auf diesen Speicher!
      int j=7;
      i=&j;
      //das ist ein verbrechen!
      //denn nun zeigt i auf j und nichtmehr auf den reservierten Speicher.
      //das bedeutet, dass der reservierte Speicher fuer immer verloren ist.
      //dh niemand wir den speicher wieder freigeben koennen (nur das Betriebssystem kann
      //dies noch tun - und das fruehestens nach dem unsere Programm sich beendet hat)
      char* c;
      c=new char[j];
      //hier haben wir ein Array!
      //anders als bei den herkoemmlichen arrays, kann die
      //anzahl der elemente auch aus einer variable stammen.
      delete [] c;
      //wenn man mit new[] den Speicher holt, muss man den Speicher mit
      //delete[] wieder freigeben!
      delete i;
      //bei einem new muss man delete machen :)
      //aber achtung!
      //i zeigt auf j! dh wir wuerden hier den speicher von j freigeben wollen,
      //das geht natuerlich nicht, denn j liegt auf dem Stack
      //-> undefined behavior (meistens Programmabsturz)!
    }

Deine Aufgabe ist es jetzt, das 'Zweierreihe Programm' neu zuschreiben. Diesmal soll der User selber eingeben können, welche Zahlen-Reihe er wünscht und wieviele Elemente das Array haben soll.

Hier ist die Lösung

top