Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Relevanta dokument
Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Kapitel 6 - Undantag

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Tentamen EDAF30 Programmering i C++

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

TDIU01 - Programmering i C++, grundkurs

Dynamisk bindning och polymorfism

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

Det finns många flaggor till g++,

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Classes och Interfaces, Objects och References, Initialization

TDDC76 - Programmering och Datastrukturer

TDIU01 Programmering i C++

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

TDDC76 - Programmering och Datastrukturer

Tentamen EDAF30 Programmering i C++

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Innehåll. Pekare Syntax

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TDDC76 - Programmering och Datastrukturer

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Tentamen EDAF30 Programmering i C++

Föreläsning 6: Metoder och fält (arrays)

TDIU01 - Programmering i C++, grundkurs

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

C++ Objektorientering - Klasser. Eric Elfving

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

C++-programmets beståndsdelar

TDDC76 - Programmering och Datastrukturer

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDDC76 - Programmering och Datastrukturer

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tillämpad programmering

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

grundläggande C++, funktioner m.m.

Programsystemkonstruktion med C++

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Introduktion till arv

Tommy Färnqvist, IDA, Linköpings universitet

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

TDIU01 - Programmering i C++, grundkurs

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Tentamen EDAF30 Programmering i C++

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Objektorienterad programmering

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Funktionens deklaration

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

TDDC76 - Programmering och Datastrukturer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 2, vecka 8: Repetition

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Programsystemkonstruktion med C++

Objektorienterad programmering

TDIU20 - Objektorienterad programmering i c++ - föreläsning 6

Arv bakgrund (kap. 9)

5 Arv och dynamisk bindning FIGUR

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TDDC76 Programmering och datastrukturer

Transkript:

Innehåll EDAF30 Programmering i C++ 7. Resurshantering, Felhantering Sven Gestegård Robertz Datavetenskap, LTH 2016 1 Resurshantering Stack-allokering Heap-allokering: new och delete 2 Felhantering Exceptions Att generera exceptionella händelser Specifikation av exceptionella händelser Static assert 3 Smarta pekare 7. Resurshantering, Felhantering 2/1 Resurshantering Resource handles En resurs är något som måste allokeras och senare lämnas tillbaka minne filer (file handles) sockets lås... Organisera resurshantering med klasser som äger resursen allokerar resurser i konstruktorn lämnar tillbaks resurser i destruktorn RAII Resurshantering 7. Resurshantering, Felhantering 3/41 Resurshantering 7. Resurshantering, Felhantering 4/41 allokering på stacken Två sorters minnesallokering: på stacken - automatiska variabler. Förstörs när programmet lämnar det block där de deklarerats. på heapen - dynamiskt allokerade variabler. Överlever tills de explicit avallokeras. unsigned fac( unsigned n) if(n == 0) return 1; else return n * fac(n -1); int main () unsigned f = fac (2); cout << f; return 0; main()... unsigned f: int tmp0: fac()... unsigned n: 2 unsigned tmp0: fac() fac()... unsigned n: 1 unsigned tmp0:... unsigned n: 0 Resurshantering : 7. Resurshantering, Felhantering 5/41 Resurshantering : Stack-allokering 7. Resurshantering, Felhantering 6/41

Dynamiskt minne, allokering på heapen, eller i free store Utrymme för dynamiska variabler allokeras med new double * pd = new double ; allokera en double *pd = 3.141592654; tilldela ett värde float * px; float * py; px = new float [20]; allokera array py = new float [20] 1.1, 2.2, 3.3; allokera och initiera Minne frigörs med delete delete pd; delete [] px; [] krävs för C- array delete [] py; Varning! se upp med parenteser Allokering av char[80] char * c = new char [80]; Nästan samma... char * c = new char (80); Nästan samma... char * c = new char 80; De två senare allokerar en byte och initierar den med värdet 80 ( P ). char * c = new char ( P ); Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 7/41 Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 8/41 ägarskap för resurser För dynamiskt allokerade objekt är ägarskap viktigt Ett objekt eller en funktion kan äga en resurs Ägaren är ansvarig för att avallokera resursen Om du har en pekare måste du veta vem som äger objektet den pekar på Ägarskap kan överföras vid funktionsanrop men måste inte var tydlig Varje gång du skriver new är du ansvarig för att någon kommer att göra delete när objektet inte ska användas mer. Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 9/41 Klasser RAII RAII Resource Acquisition Is Initialization Ett objekt initieras av en konstruktor Allokerar de resurser som behövs ( resource handle ) När ett objekt tas bort körs dess destruktor Frigör de resurser som ägs av objektet Vector: ta bort arrayen som elem pekar på class Vector private : double elem *; en array som inneh å ller själva vektorn int sz; storleken public : Vector ( int s) : elem new double [s], szs konstruktor ~Vector () delete [] elem ; destruktor, ta bort arrayen ; Manuell minneshantering Objekt allokerade med new måste tas bort med delete Objekt allokerade med new[] måste tas bort med delete[] annars fås en minnesläcka Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 10/41 Typiskt misstag: Att glömma allokera minne char namn [80]; * namn = Z ; Ok, namn allokerad på stacken. Ger namn [0]= Z char *p; Oinitierad pekare Ingen varning vid kompilering *p = Z ; Fel! Z skrivs till en slumpvis vald adress cin. getline (p, 80); Ger (nä stan ) garanterat exekveringsfel (" Segmentation fault ") eller minneskorruption misslyckad read_line char * read_line () char temp [80] ; cin. getline (temp, 80); return temp ; void exempel () char * namn = read_line (); char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; " Dangling pointer ": pekare till objekt som inte lä ngre finns Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 11/41 Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 12/41

Delvis korrigerad version av read_line char * read_line () cin. getline (temp, 80); size_t len=strnlen (temp,80); char * res = new char [ len +1]; strncpy (res, temp, len+1); return res ; Dynamiskt allokerat ö verlever void exempel () char * namn = read_line (); char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; Fungerar, men minnesläcka! Ytterligare korrigerad version av read_line char * read_line () cin. getline (temp, 80); size_t len=strnlen (temp,80); char *res = new char [len +1]; strncpy (res, temp, len+1); return res; Dynamiskt allokerat objekt överlever void exempel () char * namn = read_line (); NB! Anropande funktion blir ägare char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; delete [] namn ; delete [] ort; Avallokera strängarna Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 13/41 Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 14/41 Använd std::string Felhantering Tre nivåer av felhantering: Enklare och säkrare med std::string # include <iostream > # include <string > using std :: cin ; void exempel () using std :: cout ; using std :: string ; cout << "Namn :"; string namn = read_line (); string read_line () cout << " Bostadsort :"; string ort = read_line (); string res ; getline (cin, res ); cout << " Goddag, " << namn << return res ; " fraan " << ort << endl ; std::string är en resource handle RAII Dynamiskt minne behövs sällan 1 Vidta lämplig åtgärd direkt för att möjliggöra fortsatt exekvering 2 Kategorisera och skicka vidare felet till någon annan programenhet, som förväntas hantera det 3 Identifiera felet, ge något felmeddelande samt låt därefter programmet krascha ( fail-fast, t ex assert) Nivå 2: exceptions (eller returvärde) Resurshantering : Heap-allokering: new och delete 7. Resurshantering, Felhantering 15/41 Felhantering : Exceptions 7. Resurshantering, Felhantering 16/41 Exceptionella händelser (exceptions, undantag ) Att generera exceptionella händelser Felhantering kan göras med throw och catch, (t.ex. vid indexering utanför gränser). Likt Java. Vid throw poppas aktiveringsposter från stacken tills en funktion som innehåller ett matchande catch hittas. Om ett exception inte fångas kommer programmet att krascha. (Programmet avslutas genom att terminate() anropas.) Standardklasser för exceptions: #include <stdexcept> Syntax för throw throw exceptionnamn (" Extra info "); throw invalid_argument (" till f2"); Felhantering : Exceptions 7. Resurshantering, Felhantering 17/41 Felhantering : Att generera exceptionella händelser 7. Resurshantering, Felhantering 18/41

Att generera exceptionella händelser Att generera exceptionella händelser Klassträd för klasserna i <stdexcept> length error Deklaration av egna undantag som subklasser logic error invalid argument out of range class communication_error : public runtime_error public : communication_error ( const string & mess = "") : runtime_error ( mess ) ; exception domain error Användning av egendeklararade undantag runtime error range error overflow error underflow error throw communication_error (" Checksum error "); Felhantering : Att generera exceptionella händelser 7. Resurshantering, Felhantering 19/41 Felhantering : Att generera exceptionella händelser 7. Resurshantering, Felhantering 20/41 Felhantering try Programkod där fel kan uppst å catch ( parameter av nå gon typ ) Kod som tar hand om denna typ av fel catch ( parameter av nå gon typ ) Kod som tar hand om denna typ av fel catch (...) Kod som tar hand om resten ( default ) Den första catch-sats som matchar typen väljs. Fånga subklasser före superklassen. int i; try cout << "Nästa tal? "; if (!( cin >> i)) break ; int r = f(i); cout << " Resultat : " << r << endl ; catch ( overflow_error ) cout << Resultat utanf ör giltigt område ); catch ( exception & e) Felhantering : 7. Resurshantering, Felhantering 21/41 Felhantering : 7. Resurshantering, Felhantering 22/41... och skicka vidare int i; try cout << "Nä sta tal? "; if (!( cin >> i)) break ; int r = f(i); cout << " Resultat : " << r << endl ; catch ( overflow_error ) cout << Resultat utanf ör giltigt omr åde ); catch ( exception & e) Fördefinierad funktion i klassen exception try do_something (); catch length_error & le) hantera length error catch out_of_range &) throw ; skicka vidare catch (...) default Felhantering : 7. Resurshantering, Felhantering 22/41 Felhantering : 7. Resurshantering, Felhantering 23/41

Resurshantering: destruktorer körs vid stack unwinding struct Foo int x; Foo ( int ix) :xix cout << " Foo (" <<x<<")\n"; ~ Foo () cout << "~ Foo (" <<x<<")\n"; ; void test (int i) Foo f(i); if(i == 0) throw std :: out_of_range ("noll?"); else Foo g (100+ i); test (i -1); cout << " after call to test (" << i -1 << ")\n"; int main () Foo f (42); try Foo g (17); test (2); catch (std :: exception & e) cout <<e. what ()<< endl ; Foo (42) Foo (17) Foo (2) Foo (102) Foo (1) Foo (101) Foo (0) ~ Foo (0) ~ Foo (101) ~ Foo (1) ~ Foo (102) ~ Foo (2) ~ Foo (17) noll? ~ Foo (42) Felhantering : 7. Resurshantering, Felhantering 24/41 Specifikation av exceptionella händelser i C++11 Nyckelordet noexcept anger om en funktion får lov att generera exceptions eller inte. Att inte ange något är samma som noexcept(false). I deklarationen av funktionen struct Foo void f(); void g() noexcept ; ; och i definitionen av funktionen # include <stdexcept > void Foo ::f() throw std :: runtime_error ("f failed "); void Foo ::g() noexcept throw std :: runtime_error ("g lied and failed "); Felhantering : Specifikation av exceptionella händelser 7. Resurshantering, Felhantering 25/41 Specifikation av exceptionella händelser Excempel på användning Specifikation av exceptionella händelser äldre C++, använd inte # include <typeinfo > for typeid void test_noexcept () Foo f; try f.f (); catch (std :: exception &e) try f.g (); catch (std :: exception &e) cout << " done \n"; St13runtime_error : f failed terminate called after throwing an instance of std :: runtime_error what (): g lied and failed I äldre C++ fanns händelselistor för en funktion: typerna för de händelser som kan genereras av funktionen specificeras med nyckelordet throw. Exempel på händelselista: int f( int ) throw (typ1, typ2, typ3 ) throw typ1 ("Fel av typ 1 har intr ä ffat "); throw typ2 ("Fel av typ 2 har intr ä ffat "); throw typ3 ("Fel av typ 3 har intr ä ffat "); Ingen lista Alla typer av händelser kan genereras Tom lista (throw()) Inga händelser kan genereras Felhantering : Specifikation av exceptionella händelser 7. Resurshantering, Felhantering 26/41 Felhantering : Specifikation av exceptionella händelser 7. Resurshantering, Felhantering 27/41 Tumregler för exceptions Static assert Tänk på felhantering tidigt i designen Använd specifika exception-typer, inte inbyggda typer. (använd inte throw 17;, throw false;, etc. ) Throw by value, catch by reference Om en funktion inte ska kasta exceptions, deklarera noexcept. Specificera invarianter för dina typer Konstruktorn säkerställer invarianten, eller kastar ett exception. Medlemsfunktioner kan lita på invarianten. Medlemsfunktioner måste upprätthålla invarianten. Vektor storleken ant är ett positivt heltal arrayen p pekar på är av storlek ant Om allokeringen av arrayen misslyckas kastas std::bad_alloc Om nånting kan kontrolleras vid kompilering, använd static_assert. Felhantering : Specifikation av exceptionella händelser 7. Resurshantering, Felhantering 28/41 constexpr int some_param = 10; int foo(int x) static_assert ( some_param > 100, " some_param too small "); return 2*x; int main () int x = foo (5); std :: cout << "x is " << x << std :: endl ; return 0; error : static assertion failed : some_param too small Felhantering : Static assert 7. Resurshantering, Felhantering 29/41

Dynamiskt minne, exempel Felhantering C++: Smarta pekare I standardbiblioteket <memory> finns två smarta pekare (C++11): void f(int i, int j) X* p= new X; allocate new X if(i <99) throw E ; may throw an exception if(j <77) return ; may return " early " p->do_something (); may throw delete p; Läcker minne om inte delete p anropas Smarta pekare 7. Resurshantering, Felhantering 30/41 std::unique_ptr<t> ensamt ägarskap std::shared_ptr<t> delat ägarskap som är resource handles : deras destruktor avallokerar objektet de pekar på. Andra exempel på resource handles : std::vector<t> std::string shared_ptr innehåller en referensräknare: när sista shared_ptr till ett objekt förstörs avallokeras objektet. Jfr. garbage collection i Java. Smarta pekare 7. Resurshantering, Felhantering 31/41 Smart pointer, exempel Smart pointer, exempel Dynamiskt minne behövs sällan void f(int i, int j) unique_ptr <X> pnew X; allocate new X and give to unique_ptr if(i <99) throw E ; may throw an exception if(j <77) return ; may return " early " p->do_something (); may throw delete p; Destruktorn för p körs alltid void f(int i, int j) X x1 ; X x2 ; if(i <99) throw E; may throw an exception if(j <77) return ; may return " early " x1. do_something (); may throw x2. do_something (); may throw Använd lokala variabler om möjligt Smarta pekare 7. Resurshantering, Felhantering 32/41 Smarta pekare 7. Resurshantering, Felhantering 33/41 read_line med unique_ptr read_line med unique_ptr helt utan explicita new och delete (c++14) unique_ptr <char []> read_line () cin. getline (temp, 80); int size = strlen ( temp )+1; char * res = new char [ size ]; strncpy (res, temp, size ); return unique_ptr <char []> res ; void exempel () unique_ptr <char []> namn = read_line (); unique_ptr <char []> ort = read_line (); cout << " Goddag " << namn.get () << " fraan " << ort.get () << endl ; unique_ptr <char []> read_line () cin. getline (temp, 80); int size = strlen ( temp )+1; auto res = std :: make_unique <char []> (size ); strncpy (res.get (), temp, size ); return res; För att få en char* används unique_ptr<char[]>::get(). Smarta pekare 7. Resurshantering, Felhantering 34/41 Smarta pekare 7. Resurshantering, Felhantering 35/41

Smarta pekare Vector från tidigare C++: Smarta pekare Tumregler för parametrar till funktioner: class Vector public : Vector ( int s) : elem new double [s], szs double & operator []( int i) return elem [i ]; int size () return sz ; private : std :: unique_ptr <double []> elem ; int sz; ; om ägarskap inte ska överföras Använd råa pekare Använd std::unique_ptr<t> const & om ägarskap ska överföras. Använd värdeanropad std::unique_pointer<t> (då måste man använda std::move()) Detta är bara en orientering om att smarta pekare finns. Råa pekare är så vanliga att ni måste lära er behärska dem. Smarta pekare 7. Resurshantering, Felhantering 36/41 Smarta pekare 7. Resurshantering, Felhantering 37/41 C++: Smarta pekare Grov sammanfattning Läsanvisningar Råa ( nakna ) pekare: Programmeraren ansvarar för allt Risk för minnesläckor Risk för dangling pointers Smarta pekare: Ingen (mindre) risk för minnesläckor (liten) Risk för dangling pointers om de används fel (t ex mer än en unique_ptr) Referenser till relaterade avsnitt i Lippman Arrayer 3.5, 12.2.1, (12.2.2) Exceptions 5.6, 18.1.1 Dynamiskt minne och smarta pekare 12.1 unique_ptr 12.1.5 (s. 470 471) Smarta pekare 7. Resurshantering, Felhantering 38/41 Smarta pekare 7. Resurshantering, Felhantering 39/41 Nästa föreläsning Klasser: resurshantering och polymorfism Referenser till relaterade avsnitt i Lippman Klasser, resurshantering 13.1, 13.2 Move semantics 13.6 Operatorer och typomvandling kapitel 14 Dynamisk poymorfism och arv kapitel 15 15.4 Arv och resurshantering 15.7 Pekaren this s. 257 260 Smarta pekare 7. Resurshantering, Felhantering 40/41