Informatik W12
Levin Ceglie
Outline
- Quiz??
- Memory Management
- Shared and Unique Pointers
- Muddiest Point
Memory Management
Kurze visuelle Erklärung von new und delete Operatoren.
Code Example (Box (copy))
Gemeinsam das Code Example durchgehen.
test_destructor1 anschauen und Programm mit Eingabe 0 laufen lassen.
Frage: Was geht momentan schief?
Antwort: Wir haben mittels new Speicher für einen int auf dem Heap alloziiert. Im default Destruktor werden jedoch lediglich die Variabeln gelöscht. Für mit new alloziierter Speicher ist man immer selbst verantwortlich!
Frage: Wie könnte der Destruktor aussehen, den mittels new alloziierten int korrekt zu löschen? Wie können wir die Ausführung des Destruktors im Code “visualisieren”?
Lösung:
Box::~Box() {
std::cerr << "destructor: value=" << *ptr << " at " << ptr << std::endl;
delete ptr;
ptr = nullptr;
}test_destructor2 anschauen und Programm mit Eingabe 1 laufen lassen.
Frage: Was geht schief? Wo ensteht der Memory Leak?
Antwort: Wir haben eine Instanz von Box mittels new auf dem Heap gespeichert. Wir sind selbst dafür verantwortlich diesen Speicher wieder freizugeben.
test_copy_constructor anschauen und Programm mit Eingabe 2 laufen lassen.
schwierige Frage: Was geht hier schief?
Antwort: Da wir im Copy Konstruktor nichts tun wird ptr default initialized, also zu nullptr. Dies führt dann zu einem Fehler, wenn wir ptr in value() dereferenzieren wollen.
Frage: Welche Methode wird bei Box demo_copy = demo; aufgerufen?
Antwort: Der Copy Konstruktor! Box::Box(const Box& other)
Frage: Wie könnte der Copy Konstruktor aussehen?
Lösung:
Box::Box(const Box& other) {
//`new int(v)` dynamically allocates a new int, and uses the
//constructor of ints to initialise the new object.
ptr = new int(*other.ptr);
std::cerr << "copy constructor: value=" << *ptr << " at " << ptr << std::endl;
}test_assignment anschauen und Programm mit Eingabe 3 laufen lassen.
Frage: Welche Methode wird bei demo_copy = demo; aufgerufen?
Antwort: Der Assignment Operator! Box& Box::operator=(const Box& other)
Frage: Wie könnte der Assignment Operator aussehen?
Lösung:
Box& Box::operator= (const Box& other) {
*ptr = *other.ptr;
std::cerr << "assignment operator: value=" << *ptr << " at " << ptr << std::endl;
return *this;
}Shared and Unique Pointers
Smart Pointers (zum Beispiel Shared oder Uniqe Pointers) sind Pointers, die für dich das Memory Management übernehmen (new, delete).
Code Example (Shared and Unique Pointers (explanation))
Muddiest Point
Wir haben in den vergangenen Wochen einige schwierigere Konzepte (z.B. Pointers, Iteratoren, dynamische Datenstrukturen,…) eingeführt. Darum möchten wir uns jetzt Zeit nehmen, um über diese Konzepte zu reflektieren und Unklarheiten zu klären.
Aufgabe: Nimm dir 5’ Zeit um auf einem Stück Papier (und danach auf der Wandtafel) Unklarheiten zu den oben aufgeführten Konzepte aufzuschreiben.