Dynamische Speicherverwaltung in C++

Diese Lektion behandelt das Anlegen und Verwalten von Speicher zur Laufzeit. Fokus liegt auf new, delete und modernen C++-Techniken wie Smart Pointern.

1. Warum dynamischer Speicher?

Statischer Speicher wird zur Compile-Zeit festgelegt. Dynamischer Speicher erlaubt:

2. Grundlegende Syntax: new und delete

new reserviert Speicher dynamisch, delete gibt ihn wieder frei.
int* ptr = new int;   // einzelnes int
*ptr = 42;

int* arr = new int[10]; // Array mit 10 ints

delete ptr;             // Speicher freigeben
delete[] arr;           // Array-Speicher freigeben
Immer delete aufrufen, sonst entsteht ein Memory Leak!

3. Initialisierung beim new

Neue Objekte können sofort initialisiert werden.
int* p = new int(5);       // Einzelwert 5
double* d = new double(3.14);  // Einzelwert 3.14

int* arr = new int[5]{1,2,3,4,5}; // Array initialisiert

4. Pointer und Zugriff

Dynamische Variablen werden über Pointer adressiert.
int* ptr = new int(10);
cout << *ptr << endl; // Dereferenzierung
*ptr = 20;                     // Wert ändern
cout << *ptr << endl;
delete ptr;

5. Mehrdimensionale Arrays

Mehrdimensionale Arrays können dynamisch mit Schleifen angelegt werden.
int rows = 3, cols = 4;
int** matrix = new int*[rows];
for(int i = 0; i < rows; i++)
    matrix[i] = new int[cols];

// Zugriff:
matrix[1][2] = 42;

// Speicher freigeben:
for(int i = 0; i < rows; i++)
    delete[] matrix[i];
delete[] matrix;

6. Smart Pointer

Moderne C++-Technik nutzt Smart Pointer (unique_ptr, shared_ptr) um Speicherlecks zu vermeiden.
#include <memory>

unique_ptr<int> uptr = make_unique<int>(10);
cout << *uptr << endl;

// kein delete nötig, automatisch freigegeben
Smart Pointer übernehmen Lebenszyklusverwaltung. Alte new/delete-Aufrufe können so sicher ersetzt werden.

7. Zusammenfassung