Programmier-Befehle - Woche 12 PDF

Summary

This document covers programming concepts, such as dynamic data types, destructors, operator=, and smart pointers in C++. It gives examples and explanations of these concepts, focusing on memory management.

Full Transcript

Programmier-Befehle - Woche 12 Dynamische Datentypen Objekt mit dynamischer Lebensdauer er- new, delete stellen. Mit new wird ein Objekt erstellt, indem der nötige Speicherplatz reser- viert wird, und dann ein gegebener Konstr...

Programmier-Befehle - Woche 12 Dynamische Datentypen Objekt mit dynamischer Lebensdauer er- new, delete stellen. Mit new wird ein Objekt erstellt, indem der nötige Speicherplatz reser- viert wird, und dann ein gegebener Konstruktor aufgerufen wird. Bei delete wird zuerst ein Destruktor aufgerufen, bevor der Speicherplatz freigegeben wird. Der Rückgabewert von new ist ein Pointer auf das neu erstellte Objekt. Wird mit delete ein Objekt gelöscht, so sollte man immer alle Pointer, die auf das Objekt zeigen, auf nullptr setzen. Jedes new braucht ein delete. Sonst existieren die erstellten Objekte bis zum Ende des Programms, was je nach Laufdauer eine grosse Speicherver- schwendung ist. Class My Class { public: My Class (const int i) : y (i) { std::cout next; n != nullptr; n = n->next) { lnode* copy = new lnode(n->value, nullptr); prev->next = copy; prev = copy; } } Seite 2 von 6 Programmier-Befehle - Woche 12 Destruktor Klasse abbauen Der Destruktor einer Klasse ist eine eindeutige Memberfunktion die automa- tisch aufgerufen wird wenn, die Speicherdauer eines Klassenobjekts endet (z.B. beim Aufrufen von delete order wenn der Gültigkeisbereich des Objekts endet.). Falls eine Klasse keinen Destruktor deklariert wird automatisch einer erzeugt. Der automatisch erzeuge Destruktor ruft den Destruktor aller Membervariablen auf. class stack { public: stack(); // constructor stack(const stack& s); // copy constructor ∼stack(); // destructor private: lnode* topn; }; stack::∼stack() { while (topn != nullptr) { lnode* t = topn; topn = t->next; delete t; } } Seite 3 von 6 Programmier-Befehle - Woche 12 operator= Kopier-Zuweisung Eng verwandt mit operator= ist der Copy-Konstruktor. Der Unterschied ist, dass der Copy-Konstruktor nur bei der Initialisierung aufgerufen wird, operator= hingegen nur nach der Initialisierung. z.B. my class a(5, 6), c(4, 4); // Call a general constructor my class b = a; // Call copy-constructor c = b; // Call operator= operator= muss gegebenenfalls anders als der Copy-Konstruktor imple- mentiert werden. Ein Beispiel sind Klassen, welche Pointer auf dynamisch generierte Objekte als Member haben. Dann muss bei operator= meistens zuerst das aktuell vorhandene Objekt gelöscht werden, bevor die Kopie er- stellt werden kann. Dies ist beispielsweise beim Stack aus der Vorlesung relevant. operator= gibt im Normalfall eine Referenz auf seinen linken Operanden zurück. Faustregel: Meistens führt operator= die Aufgaben des Copy-Konstruktors und Destruktors aus. class stack { public: stack(); // constructor stack(const stack& s); // copy constructor ∼stack(); // destructor stack& operator=(const stack& s); // assignment operator private: lnode* topn; }; stack& stack::operator= (const stack& s) { if (this != &s) { // no self assignment stack copy = s; // copy constructor std::swap(topn, copy.topn); // copy now contains old topn pointer } // copy goes out of scope. Destructor will be called which clean up everything. } Seite 4 von 6 Programmier-Befehle - Woche 12 Dreierregel Rule of Three Wenn eine Klasse einen Destruktor, Copy-Konstruktor, oder den Kopier- Zuweisungs operator definiert, dann sollte sie alle drei definieren. Seite 5 von 6 Programmier-Befehle - Woche 12 Smart Pointers std::shared ptr Shared Pointer Ein std::shared ptr ist ein Zeiger auf ein Objekt der Klasse T, der sich die Anzahl der Zeiger die auf dieses Objekt zeigen merkt. Sobald die Anzahl der Zeiger auf das Objekt auf 0 fällt wird das Objekt automatisch gelöscht. class SomeClass { public: SomeClass(); void f(); }; // Create a shared pointer, you can pass the usual constructor arguments for the ’SomeClass’ constructors std::shared ptr s1 = std::make shared(); // Shared pointers can be used like regular pointers s1->f(); { // Create another shared pointer pointing to new object std::shared ptr s2(new SomeClass()); // Shared pointers can be assigned s1 = s2; // Point s1 to the same object as s2 // The object s1 used to point to will now be deleted. // We can check how many pointers point to the same object std::cout

Use Quizgecko on...
Browser
Browser