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

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

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

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

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

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

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

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

Innehåll. Pekare Syntax

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

TDDC76 - Programmering och Datastrukturer

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

TDDC76 - Programmering och Datastrukturer

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

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

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

TDDC76 - Programmering och Datastrukturer

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

Det finns många flaggor till g++,

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

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

Dynamisk bindning och polymorfism

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

TDIU01 Programmering i C++

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

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

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

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

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

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Kapitel 6 - Undantag

Tentamen EDAF30 Programmering i C++

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

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

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

Tommy Färnqvist, IDA, Linköpings universitet

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

C++-programmets beståndsdelar

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

Tillämpad programmering

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

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

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

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Tentamen EDAF30 Programmering i C++

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

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

TDIU01 - Programmering i C++, grundkurs

Övning från förra gången: readword

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

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

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

TDDC76 - Programmering och Datastrukturer

5 Arv och dynamisk bindning FIGUR

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Arv bakgrund (kap. 9)

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

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Programsystemkonstruktion med C++

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

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

C++ - En introduktion

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

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

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Föreläsning 2, vecka 8: Repetition

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

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

Tentamen EDAF30 Programmering i C++

Programsystemkonstruktion med C++

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

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

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

Introduktion till arv

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

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

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

C++ Objektorientering - Klasser. Eric Elfving

Tentamen C++-programmering

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Transkript:

Innehåll EDAF30 Programmering i C++ 6. Resurshantering Sven Gestegård Robertz Datavetenskap, LTH 2017 1 Resurshantering Stack-allokering Heap-allokering: new och delete 2 Smarta pekare 3 Klasser, resurshantering Rule of three Move semantics (C++11) 4 Konstanter 6. Resurshantering 2/1 Resurshantering Resource handles En resurs är något som måste allokeras och senare lämnas tillbaka Exempel: 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 Användardefinierade typer som uppför sig som inbyggda Resurshantering 6. Resurshantering 3/40 Resurshantering 6. Resurshantering 4/40 Exempel: 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 : 6. Resurshantering 5/40 Resurshantering : Stack-allokering 6. Resurshantering 6/40

Dynamiskt minne, allokering på heapen, eller i free store Dynamiskt minne, allokering på heapen, eller i free store Utrymme för dynamiska variabler allokeras med new Dynamiskt allokerat minne allokeras på heapen, med new (som i Java) tillhör inget scope finns kvar tills det avallokeras med delete (skillnad mot Java) 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; Resurshantering : Heap-allokering: new och delete 6. Resurshantering 7/40 Resurshantering : Heap-allokering: new och delete 6. Resurshantering 8/40 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 ); 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 odefinierad adress cin. getline (p, 80); // Ger (nä stan ) garanterat exekveringsfel // (" Segmentation fault ") eller // minneskorruption Resurshantering : Heap-allokering: new och delete 6. Resurshantering 9/40 Resurshantering : Heap-allokering: new och delete 6. Resurshantering 10/40 Exempel: 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 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! Resurshantering : Heap-allokering: new och delete 6. Resurshantering 11/40 Resurshantering : Heap-allokering: new och delete 6. Resurshantering 12/40

Använd std::string 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 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 Resurshantering : Heap-allokering: new och delete 6. Resurshantering 13/40 Resurshantering : Heap-allokering: new och delete 6. Resurshantering 14/40 ä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 6. Resurshantering 15/40 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 Exempel: 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 6. Resurshantering 16/40 Klasser Resurshantering, representation Dynamiskt minne, exempel Felhantering struct Vector Vector ( int s) :szs, elem new double (sz ) ~ Vector () delete [] elem ; double & operator []( int i) return elem [i]; int sz; double * elem ; ; void test () Vector vec (5); vec [2] = 7; Vector vec: sz: 5 elem 7 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 Resource handle Vector äger sin double[] objektet: pekare + storlek, arrayen ligger på heapen Resurshantering : Heap-allokering: new och delete 6. Resurshantering 17/40 Smarta pekare 6. Resurshantering 18/40

C++: Smarta pekare Smart pointer, exempel I standardbiblioteket <memory> finns två smarta pekare (C++11): 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 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 Destruktorn för p körs alltid 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 6. Resurshantering 19/40 Smarta pekare 6. Resurshantering 20/40 Smart pointer, exempel Dynamiskt minne behövs sällan read_line med unique_ptr void f(int i, int j) X x ; if(i <99) throw E ; // may throw an exception if(j <77) return ; // may return " early " 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 ; x. do_something (); // may throw Använd lokala variabler om möjligt void exempel () unique_ptr <char []> namn = read_line (); unique_ptr <char []> ort = read_line (); cout << " Goddag " << namn.get () << " fraan " << ort.get () << endl ; För att få en char* används unique_ptr<char[]>::get(). Smarta pekare 6. Resurshantering 21/40 Smarta pekare 6. Resurshantering 22/40 read_line med unique_ptr helt utan explicita new och delete (c++14) Smarta pekare Vector från tidigare 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 ; 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; ; Smarta pekare 6. Resurshantering 23/40 Smarta pekare 6. Resurshantering 24/40

C++: Smarta pekare C++: Smarta pekare Grov sammanfattning Tumregler för parametrar till funktioner: 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. 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) Smarta pekare 6. Resurshantering 25/40 Smarta pekare 6. Resurshantering 26/40 Rule of three Canonical construction idiom Varnande exempel Default-kopiering Om en klass äger någon resurs, ska den ha en egen 1 Destruktor 2 Copy constructor 3 Copy assignment operator för att inte läcka minne. T ex. klassen Vektor För klasser som äger resurser fungerar inte default-kopiering. värdeanrop kopiering destruktorn körs vid return dangling pointer Exempel: Vector Regel: Om du definerar någon, ska du definiera alla. Klasser, resurshantering : Rule of three 6. Resurshantering 27/40 Klasser, resurshantering : Rule of three 6. Resurshantering 28/40 Move semantics Move semantics (C++11) Exempel: Vektor Copy-konstruktor Onödigt att kopiera om man vet att källan ska förstöras direkt Bättre att stjäla innehållet Gör resource handles ännu effektivare Vissa objekt får/kan inte kopieras std::move gör om till en rvalue-referens (T&&) Vector :: Vector (const Vector & v) :elem new double [v.sz ], szv.sz for (int i=0; i < sz; ++i) elem [i] = v[i]; Move-konstruktor Vector :: Vector ( Vector && v) : elem v.elem, szv.sz v. elem = nullptr ; v.sz = 0; // v har inga element Klasser, resurshantering : Move semantics (C++11) 6. Resurshantering 29/40 Klasser, resurshantering : Move semantics (C++11) 6. Resurshantering 30/40

Move semantics (C++11) Exempel: Vektor Copy-assignment Vector & Vector :: operator =( const Vector & v) if( this!= &v) double * tmp = new double [v.sz ]; for (int i = 0; i < v.sz; ++i) tmp [i] = v[i]; delete [] elem ; elem = tmp ; sz = v.sz; return * this ; Move-assignment Vector & Vector :: operator =( Vector && v) if( this!= &v) elem = v. elem ; // " flytta " arrayen från v v. elem = nullptr ; // markera att v är ett " tomt skrov " sz = v.sz; v.sz = 0; return * this ; Rule of three five Canonical construction idiom, fr o m C++11 Om en klass äger någon resurs, ska den ha en egen 1 Destruktor 2 Copy constructor 3 Copy assignment operator 4 Move constructor 5 Move assignment operator Klasser, resurshantering : Move semantics (C++11) 6. Resurshantering 31/40 Klasser, resurshantering : Move semantics (C++11) 6. Resurshantering 32/40 Typer Två sorters konstanter Medlemsfunktioner kan vara const En variabel deklarerad const får inte ändras (final i Java) Betyder ungefär Jag lovar att inte ändra denna variabel. Kontrolleras av kompilatorn Används ofta för att specificera gränssnitt En funktion som inte ändrar värdet på argument En medlemsfunktion ( metod ) som inte ändrar objektets tillstånd. Viktigt vid (medlems-)funktionsöverlagring En variabel deklarerad constexpr måste ha ett värde som kan beräknas vid kompilering. Används för att specificera konstanter Infördes i C++-11 Betyder att de inte ändrar objektets tillstånd Viktigt vid överlagring T func(int) och T func(int) const är olika funktioner exempel: class Container public : double & operator [](); double operator []() const ; ; Konstanter 6. Resurshantering 33/40 Konstanter 6. Resurshantering 34/40 Funktioner kan vara constexpr const och pekare Betyder att de kan beräknas vid kompilering om argumenten är constexpr exempel: constexpr int square ( int x) return x*x; void test_constexpr_fn () char matrix [ square (4) ]; cout << " sizeof ( matrix ) = " << sizeof ( matrix ) << endl ; Utan constexpr får man felet error : variable length arrays are a C99 feature const modifierar allt som står till vänster om (undantag: om const står först modifieras det som kommer omedelbart efter) Exempel int * ptr; const int* ptrtoconst ; // NB! ( const int) * int const * ptrtoconst, // ekvivalent, tydligare? int * const constptr ; // pekaren är konstant const int* const constptrtoconst ; // Både pekare och värde int const * const constptrtoconst ; // ekvivalent, tydligare? Var noggrann när du läser: char * strcpy (char *dest, const char *src ); (const char)*, inte const (char*) Konstanter 6. Resurshantering 35/40 Konstanter 6. Resurshantering 36/40

const och pekare Exempel Pekare void Exempel ( int * ptr, int const * ptrtoconst, int * const constptr, int const * const constptrtoconst ) * ptr = 0; // OK: ä ndrar inneh å llet ptr = nullptr ; // OK: ä ndrar pekaren Pekare på konstanter och konstant pekare int k; // ä ndringsbar int int const c = 100; // konstant int int const * pc; // pekare till konstant int int *pi; // pekare till ä ndringsbar int * ptrtoconst = 0; // Fel! kan inte ä ndra inneh å llet ptrtoconst = nullptr ; // OK: ä ndrar pekaren * constptr = 0; // OK: ä ndrar inneh å llet constptr = nullptr ; // Fel! kan inte ä ndra pekaren * constptrtoconst = 0; // Fel! kan inte ä ndra inneh å llet constptrtoconst = nullptr ; // Fel! kan inte ä ndra pekaren pc = &c; // OK pc = &k; // OK, men k kan inte ä ndras via *pc pi = &c; // FEL! pi får ej peka på en konstant *pc = 0; // FEL! pc pekar på en konstant int * const cp = &k; // Konstant pekare cp = nullptr ; // FEL! Pekaren ej flyttbar *cp = 123; // OK! Ä ndrar k till 123 Konstanter 6. Resurshantering 36/40 Konstanter 6. Resurshantering 36/40 char[], char* och const char* const är viktigt för C-strängar Nästa föreläsning En string literal (t ex "I am a string literal") är const. Kan lagras i icke-skrivbart minne char* str1 = "Hello"; deprecated i C++ ger varning const char* str2 = "Hello"; OK, strängen är const char str3[] = "Hello"; str3 går att ändra Felhantering. Funktionsmallar Referenser till relaterade avsnitt i Lippman Exceptions 5.6, 18.1.1 Funktionsmallar 16.1.1 Konstanter 6. Resurshantering 37/40 Sammanfattning 6. Resurshantering 39/40 Läsanvisningar Referenser till relaterade avsnitt i Lippman Dynamiskt minne och smarta pekare 12.1 Dynamiskt allokerade arrayer 12.2.1 Klasser, resurshantering 13.1, 13.2 const och constexpr 2.4 Sammanfattning 6. Resurshantering 40/40