Pointer und Speicher

Dynamische Speicherverwaltung

Dynamischer Speicher wird benötigt, wenn Größe oder Lebensdauer zur Compilezeit unbekannt sind.

Was ist Dynamische Speicherverwaltung?

Dynamischer Speicher wird benötigt, wenn Größe oder Lebensdauer zur Compilezeit unbekannt sind.

Allokiere ein Array zur Laufzeit und gib es sicher frei.

Wichtige Punkte

  • Jeder Pointer verweist auf ein lebendes kompatibles Objekt oder ist null.
  • Jede eigene Allokation wird genau einmal freigegeben.
  • Formuliere Ownership und const-Schnittstellen eindeutig.

Codebeispiele in C und C++

C
Code ausführen →
main.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    size_t count = 5;
    int *values = calloc(count, sizeof *values);
    if (!values) return 1;
    for (size_t i = 0; i < count; ++i) values[i] = (int)(i * i);
    printf("last=%d\n", values[count - 1]);
    free(values);
    return 0;
}
Erwartete Ausgabe
last=16
C++
Code ausführen →
main.cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> values(5);
    for (std::size_t i = 0; i < values.size(); ++i) values[i] = static_cast<int>(i * i);
    std::cout << "last=" << values.back() << '\n';
}
Erwartete Ausgabe
last=16

Vergleich zwischen C und C++

C kombiniert malloc oder calloc mit free und prüft Fehler. std::vector besitzt und bereinigt seinen Speicher automatisch und exceptionsicher.

C

Ownership und Aufräumen sind vom Programmierer durchgesetzte Konventionen.

C++

Container und RAII kodieren Ownership und Aufräumen in Objektlebenszeiten.

Übungsaufgaben

Führe beide Versionen aus und untersuche die unterschiedlichen Garantien.

  • Teste null und Allokationsfehler.
  • Verwende AddressSanitizer und UndefinedBehaviorSanitizer.
  • Dokumentiere Besitz jedes Pointers.